анимированные кнопки UIB нажимаются в пункте назначения до того, как они достигают пункта назначения - PullRequest
1 голос
/ 15 июля 2010

У меня есть UIView, который содержит пару UIB-кнопок, которые я анимирую с экрана на экран.Я считаю, что регион, куда они направляются, кликабелен, прежде чем он достигнет его.Анимация довольно проста, поэтому мне интересно, есть ли что-то очевидное, чего мне не хватает в плане указания коду не обрабатывать кнопку, как если бы она находилась в конечном пункте назначения (я не уверен, что этобудьте ожидаемым поведением, и анимация является чисто визуальной, в то время как кликабельная область мгновенно находится в месте назначения; я бы не ожидал, что это произойдет.)Это в основном отключение вспомогательной панели и возвращение основной панели с кнопками:

    // switch back to main abilities panel
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration: kFadeInTime];
    CGRect rect = CGRectMake(
        480.0f,
        mAbilities.mSubPanel.frame.origin.y,
        mAbilities.mSubPanel.frame.size.width,
        mAbilities.mSubPanel.frame.size.height);
    mAbilities.mSubPanel.frame = rect;
    [UIView commitAnimations];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration: kFadeInTime];
    [UIView setAnimationDelay: kFadeInTime];
    rect = CGRectMake(
        kAbilitiesBorderX,
        mAbilities.mPanel.frame.origin.y,
        mAbilities.mPanel.frame.size.width,
        mAbilities.mPanel.frame.size.height);
    mAbilities.mPanel.frame = rect;
    [UIView commitAnimations];      

1 Ответ

1 голос
/ 15 июля 2010

В качестве обходного пути вы можете отключить взаимодействие пользователя с панелью перед анимацией и включить ее после завершения анимации:

// Animation compete handler
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    mAbilities.mSubPanel.userInteractionEnabled = YES;

}

// Animating panel
mAbilities.mSubPanel.userInteractionEnabled = NO;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: kFadeInTime];
[UIView setAnimationDelegate: self];
CGRect rect = CGRectMake(
    480.0f,
    mAbilities.mSubPanel.frame.origin.y,
    mAbilities.mSubPanel.frame.size.width,
    mAbilities.mSubPanel.frame.size.height);
mAbilities.mSubPanel.frame = rect;
[UIView commitAnimations];

Если вы ориентируетесь на iOS4, вы можете (и, как говорят спецификации, должны) использовать block-api:

[UIView animateWithDuration:5.0f delay:0.0f options:UIViewAnimationOptionLayoutSubviews
         animations:^(void){
             CGRect rect = CGRectMake(
                                     480.0f,
                                     mAbilities.mSubPanel.frame.origin.y,
                                     mAbilities.mSubPanel.frame.size.width,
                                     mAbilities.mSubPanel.frame.size.height);
                      mAbilities.mSubPanel.frame = rect;
         } 
         completion:NULL
     ];

Хотя анимация с использованием блоков, взаимодействие с пользователем по умолчанию отключено - вы можете включить его, установив флаг UIViewAnimationOptionAllowUserInteraction в параметре параметров:

... options:UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionAllowUserInteraction ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...