UIView анимация синхронизации с подпредставлениями - PullRequest
0 голосов
/ 06 декабря 2011

Я относительно новичок в разработке IOS. У меня есть вопрос относительно анимации UIView. В моем приложении у меня есть представление, скажем «View1», которое состоит из трех представлений, представления заголовка, представления 2 и представления нижнего колонтитула. Ширина каждого из трех видов одинакова (такая же, как у view1). Высота вида заголовка и нижнего колонтитула фиксирована, а высота View2 зависит от высоты View1. Таким образом, Высота View2 рассчитывается как Высота View1 - (высота вида заголовка + высота вида нижнего колонтитула). Авторазмер для каждого из трех подпредставлений не установлен. Таким образом, все вещи позиционирования для всех подпредставлений View1 выполняются в его методе layoutSubviews. Текущий макет View1 выглядит следующим образом

    -------------------------
    |      Header View      |
    |                       |
    -------------------------
    |                       |
    |                       |
    |       View2           |
    |                       |
    -------------------------
    |    Footer View        |
    |                       |
    -------------------------

                View1

Теперь я хочу, чтобы, когда пользователь нажимал на нижний колонтитул, view1 должен свернуться с анимацией, так что размер View2 станет равным нулю, а нижний колонтитул будет расположен чуть ниже заголовка. Поэтому после анимации текущая компоновка view1 должна выглядеть следующим образом

            -------------------------
            |    Header View        |
            |                       |
            -------------------------
            |    Footer View        |
            |                       |
            -------------------------

             View1 (After Animation)

Для достижения вышеуказанного результата я написал следующий код в методе обработчика жеста касания в представлении нижнего колонтитула в родительском представлении View1

    CGFloat headerViewHeight = self.view1.headerView.frame.size.height;
    CGFloat footerViewHeight = self.view1.footerView.frame.size.height;
    CGFloat newHeight = (headerViewHeight + footerViewHeight);
    CGRect frame = self.view1.frame;
    frame.size.height = newHeight;

    [UIView beginAnimation:nil context:NULL];
    [UIView setAnimationDuration:3.0f];

    self.view1.frame = frame;

    [UIView commitAnimation];

При запуске над кодом, на экране высота View2 устанавливается на 0, нижний колонтитул сразу же располагается под заголовком, а затем высота View1 медленно уменьшается с анимацией до newHeight с анимацией. Это не желаемый результат, я хочу, чтобы высота View1 уменьшалась с анимацией, тогда высота View2 также должна уменьшаться с той же величиной с анимацией, а представление нижнего колонтитула должно двигаться вверх с таким же количеством с анимацией, чтобы результат получался плавным. .

Любая помощь или руководство о том, как я могу достичь вышеуказанного результата?

1 Ответ

1 голос
/ 06 декабря 2011

Ниже приведен фрагмент, который работает для меня. Надеюсь, это даст вам некоторые идеи.

@implementation MasterView
{
    UIView *headerView;
    UIView *view2;
    UIView *footerView;
    bool collapsed;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor yellowColor];

        headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
        headerView.backgroundColor = [UIColor redColor];

        view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 320, 100)];
        view2.backgroundColor = [UIColor greenColor];

        footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 100)];
        footerView.backgroundColor = [UIColor blueColor];
        footerView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;

        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggle:)];
        [footerView addGestureRecognizer:tapGesture];   
    }
    return self;
}

- (void)toggle:(UITapGestureRecognizer *)recognizer
{
    [UIView animateWithDuration:1.0 animations:^{
        CGRect view2Frame = view2.frame;
        view2Frame.size.height = 0;
        view2.frame = view2Frame;

        CGRect selfFrame = self.frame;
        selfFrame.size.height -= 100;
        self.frame = selfFrame;
    }];
}

-(void)layoutSubviews
{
    [self addSubview:headerView];
    [self addSubview:view2];
    [self addSubview:footerView];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...