Почему мои анимации UIView работают нормально в iOS 5, но не в iOS 4? - PullRequest
1 голос
/ 31 октября 2011

У меня есть пользовательский UIView с вложенными представлениями типа UIImageView, UILabel и UIButton.Представление создается в коде, подобном следующему:

- (void)setupView
{
    popupView = [[UIView alloc] initWithFrame:CGRectMake(-116, -61, 247, 59)];
    popupView.autoresizingMask = 63;
    UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bubble.png"]];
    bgImageView.autoresizingMask = 63;
    [popupView addSubview:bgImageView];
    [bgImageView release];

    textLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 8, 180, 20)];
    textLabel.autoresizingMask = 63;
    textLabel.font = [UIFont fontWithName:@"DefaultNormal" size:16];
    textLabel.text = @"DYNAMIC TEXT";
    [popupView addSubview:textLabel];

    popupButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
    [rightAccessoryButton setImage:[UIImage imageNamed:@"btn-tick.png"] forState:UIControlStateNormal];
    popupButton.frame = CGRectMake(208, 8, 32, 32);
    popupButton.autoresizingMask = 63;
    [popupView addSubview:rightAccessoryButton];
}

Я установил для всех их autoresizingMask s значение 63, что в основном означает, что все находится в положении ON (я не знаю лучшего способа сделать этокроме размещения всех констант в огромной строке кода!).Затем, когда им нужно анимировать всплывающее окно, я делаю это:

- (void)animateIn
{   
    float pw = 247;
    float ph = 59;

    // set the view's initial position
    popupView.frame = CGRectMake(-pw*0.005+8, -ph*0.01-2, pw*0.01, ph*0.01);
    [self addSubview:popupView];

    [UIView animateWithDuration:0.12 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionLayoutSubviews animations:^(void) {
        popupView.frame = CGRectMake(-pw*0.55+8, -ph*1.1-2, pw*1.1, ph*1.1);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^(void) {
            popupView.frame = CGRectMake(-pw*0.475+8, -ph*0.95-2, pw*0.95, ph*0.95);
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.075 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^(void) {
                popupView.frame = CGRectMake(-round(pw/2-8), -ph-2, pw, ph);
            } completion:nil];
        }];
    }]; 
}

Немного сложной анимации, но по сути это та же анимация, что и у анимации представления выноски карты.

ТолькоДело в том, что он отлично работает на устройствах iOS 5, но на устройствах iOS 4 все не так!Метка вообще не отображается, кнопка появляется, а затем вылетает, сжимаясь в верхнем правом углу, а фоновое изображение растягивается до неправильного размера и в неправильном месте.

У кого-то еще были проблемыс анимацией в iOS 4?Нужно ли делать что-то иначе, чем в настоящее время, чтобы заставить его работать?

1 Ответ

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

(1) Вы делаете разметку вручную в реализации layoutSubviews подкласса UIView? Если нет, то вам не следует использовать UIViewAnimationOptionLayoutSubviews в настройках битовой маски. Я не знаю, в этом ли проблема, но нет смысла добавлять дополнительные источники возможных ошибок.

(2) Если есть сомнения, используйте Core Animation. Вы можете очень легко описать свою анимационную последовательность как симпатичную CAAnimationGroup.

...