2017-01-20 3 views
0

Я создал небольшой пользовательский UIView с UILabel и UIButton, это настраиваемое представление представляет собой баннер для отображения в верхней части текущего контроллера представления.Анимация пользовательского UIView с экрана делает его subviews не отвечающим

Я загружаю макет представления из файла nib и использую метод из пользовательского представления, чтобы отобразить его с помощью анимации, и представление будет скрываться через определенное количество времени. Как это.

- (void)displayBannerInViewController:(UIViewController *)vc 
{ 
    CGFloat originY = 0; 
    if (vc.navigationController != nil) { 
    originY += 20 + vc.navigationController.navigationBar.bounds.size.height - self.bounds.size.height; 
    } 
    self.frame = CGRectMake(0, 
         originY, 
         [UIScreen mainScreen].bounds.size.width, 
         self.bounds.size.height); 

    if (vc.navigationController != nil) { 
    [vc.navigationController.view insertSubview:self atIndex:1]; 
    } else { 
    [vc.view.window insertSubview:self atIndex:1]; 
    } 

    [UIView animateWithDuration:0.3 animations:^{ 
    self.frame = CGRectOffset(self.frame, 0, self.bounds.size.height); 
    } completion:^(BOOL finished) { 

    [UIView animateWithDuration:0.3 delay:self.duration options:0 animations:^{ 
     self.frame = CGRectOffset(self.frame, 0, -self.bounds.size.height); 
    } completion:^(BOOL finished) { 
     if (finished) { 
     [self removeFromSuperview]; 
     } 
    }]; 
    }]; 
} 

Я установил действие для кнопки внутри баннера с этим

[self.actionButton addTarget:self 
         action:@selector(executeActionBlock) 
       forControlEvents:UIControlEventTouchUpInside]; 

После анимации, показывающей знамя, и перед не скрыта, независимо от того, сколько раз я нажимаю на кнопку, то executeActionBlock метод никогда не вызывается.

Я установил тестовую установку начального кадра баннера в начало (0, 0) и без анимации, а затем кнопка работала нормально. Итак, я не знаю, связана ли проблема с анимацией или из-за того, что исходный фрейм баннера находится в не видимой позиции. BTW, важно, чтобы баннер не был виден, потому что приложение отображается из-под панели навигации.

Благодаря

+0

Вы удаляете вид из супервизора в конце нет? – SeanLintern88

ответ

0

Ну, кажется, я продолжаю смотреть больше, потому что я нашел this question с той же проблемой. Я попробовал решение там и сейчас работает.

Проблема в том, что связывание анимаций не является хорошей идеей для взаимодействия с пользователем, поэтому вместо этого я использовал NSTimer.

- (void)displayBannerInViewController:(UIViewController *)vc 
{ 
    CGFloat originY = 0; 
    if (vc.navigationController != nil) { 
    originY += 20 + vc.navigationController.navigationBar.bounds.size.height - self.bounds.size.height; 
    } 
    self.frame = CGRectMake(0, 
          originY, 
          [UIScreen mainScreen].bounds.size.width, 
          self.bounds.size.height); 

    if (vc.navigationController != nil) { 
    [vc.navigationController.view insertSubview:self atIndex:1]; 
    } else { 
    [vc.view.window insertSubview:self atIndex:1]; 
    } 

    [UIView animateWithDuration:0.3 animations:^{ 
    self.frame = CGRectOffset(self.frame, 0, self.bounds.size.height); 
    } completion:^(BOOL finished) { 
    [NSTimer scheduledTimerWithTimeInterval:self.duration target:self selector:@selector(hideBanner) userInfo:nil repeats:NO]; 
    }]; 
} 

- (void)hideBanner 
{ 
    [UIView animateWithDuration:0.3 animations:^{ 
    self.frame = CGRectOffset(self.frame, 0, -self.bounds.size.height); 
    } completion:^(BOOL finished) { 
    if (finished) { 
     [self removeFromSuperview]; 
    } 
    }]; 
} 

И теперь работает как очарование.

0

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

https://developer.apple.com/reference/uikit/uiviewanimationoptions/uiviewanimationoptionallowuserinteraction?language=objc

+0

Уже пробовал, что и не работал. – WedgeSparda