2014-12-08 4 views
0

Почему-то что-то в моем коде отключает анимацию, и я не могу ее найти. Я создал панель поиска в своем приложении, у нее есть вызов делегата для начала и конца редактирования. Когда он начинается, у меня есть блок анимации, чтобы изменить его размер, и он работает, но анимация, когда она заканчивается, не работает. Я прокомментировал КАЖДУЮ строку кода, за исключением анимаций и вызовов делегатов, и даже задал задержки на блоках анимации, и он всегда устанавливается мгновенно, но взаимодействие с объектами задерживается на время анимации. Есть ли причина, по которой анимация отключена, или общий способ выяснить, почему анимация пропущена?анимация UIView не работает

EDIT: Даже отключив весь код для делегатов и имеющий блок анимации с задержкой не работает, кнопка сливают и вызывает

- (void)cancelButtonPressed:(id)sender { 
    [UIView animateWithDuration:5.0f delay:5.0f options:0 animations:^{ 
     self.layer.borderWidth = 1.0f; 
     self.layer.borderColor = [UIColor redColor].CGColor; 

    } completion:^(BOOL finished) { 

    }]; 
} 

, которая происходит мгновенно, даже не задерживает на 5 секунд.

EDIT 2: Я положил код анимации в другой блок, который может выполнить код внутри после задержки, код действительно задерживается, но анимация все еще не работает.

Редактировать 3: Вот код кнопки, вызывающей метод cancelButtonPressed.

cancelButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
      [cancelButton setTitle:NSLocalizedString(@"Cancel", @"Cancel") forState:UIControlStateNormal]; 
      cancelButton.translatesAutoresizingMaskIntoConstraints = NO; 
      [cancelButton addTarget:self action:@selector(cancelButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
      [self addSubview:cancelButton]; 

Edit 4: Вот видео вопроса анимации. Когда я нажимаю кнопку отмены, она мгновенно сокращается, но код находится в блоке анимации, который должен занять 5 секунд, вот видео и код.

Видео: http://cl.ly/3x3k3H2m1Y2F

barItem является элементом UIBarButton, его customView мой поиск бар UIView подкласс.

[UIView animateWithDuration:5.0f animations:^{ 
       barItem.width = 200; 
       CGRect addressBarFrame = barItem.customView.frame; 
       addressBarFrame.size.width = 200; 
       barItem.customView.frame = addressBarFrame; 
      } completion:^(BOOL finished) { 
       NSLog(@"COMPLETION!"); 
      }]; 

Edit 5: Что Im действительно пытается сделать: приложение Я работаю на это веб-браузер. Я создал пользовательский режим поиска. Вид находится в UIBarButtonItem, который находится внутри UIToolbar, прикрепленного к верхней части экрана. Когда пользователь забирает элемент бара, текстовое поле становится активным, и клавиатура отображается, а рамка просмотра внутри анимируется, и появляется кнопка отмены (все еще часть этого подкласса UIView в строке поиска). Когда кнопка отмены нажата, он вызывает метод внутри подкласса, и он выполняет некоторую очистку, а затем вызывает его метод делегирования на мой UIViewController, который затем будет анимировать рамку снова, чтобы стать больше. Причина, по которой мне нужно изменить фрейм, состоит в том, что, если текстовое поле становится слишком маленьким, мне нужно сделать его больше при редактировании, но тогда это может сделать его меньше при редактировании.

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

Редактирование 7: Если i анимация рамки cancelButtons или цвет фона, он будет работать. Поэтому я подумал, может быть, это проблема с панелью инструментов, в которой он находится, но анимирует цвет фона, который также работает.Поэтому я до сих пор не знаю, почему я могу анимировать рамку элемента панели и пользовательский вид (пользовательский вид в коде выше) перед редактированием, но не может его анимировать после редактирования.

Редактировать 8: Я выяснил проблему. Это была оптическая иллюзия все время. Несмотря на то, что настройка ширины UIBarButtonItem внутри блока анимации, окружающие элементы бара автоматически переместились бы в новый кадр. И хотя кадр действительно анимируется, подвиды автоматически находятся в правильном месте, но последовательность анимации заставила его выглядеть так, будто он действительно оживлял все правильно. Анимация, которую я пыталась сделать при редактировании, была более заметной, поэтому я думал, что это не анимация. Изменение вокруг некоторых вещей делает его выглядеть лучше, но я не думаю, что его возможно, чтобы элементы кнопки панели оживили то, что я хочу.

+1

Можете ли вы попытаться поместить некоторый NSLog в блок «законченный» и посмотреть, когда он печатается или вообще печатается. Это может дать некоторое представление о том, что на самом деле происходит. – Yogi

+0

Что такое слой здесь? – sanjeet

+0

Я не уверен, что '0' является даже допустимым значением параметра "options". Это может вызвать странное поведение. См. Ссылку на класс UIView и используйте допустимое значение, например «UIViewAnimationOptionCurveEaseInOut». Кроме того, если у вас нет блока завершения, вы можете просто использовать «NULL» для этого параметра. Опять же, см. Ссылку на класс UIView. –

ответ

0

Пересмотренный

Если вы пытаетесь совершить анимации, когда программно индуцированный панель поиска отменяется, то что-то, как это будет делать трюк:

@interface TableViewController : UITableViewController <UISearchBarDelegate> 

@property (strong, nonatomic) UISearchBar *searchBar; 

@end 

- (void) viewDidLoad:(BOOL)animated { 

UIView *searchbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 44)]; //This adds a container that will hold the search bar. 
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 40, 44)]; 
self.searchBar.showsCancelButton = YES; 
[searchbarView addSubview:self.searchBar]; 
self.searchBar.delegate = self; 
[self.view addSubview:searchbarView]; or add to whatever view you want. 
} 

Это где вы могли бы быть пойдет не так:

Когда панель поиска отменена, вы должны иметь метод searchBarCancelButtonClicked: вызывается:

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
[self animateButton]; 
} 

-(void)animateButton { 
//Commit your animations here: 
} 
+0

«Я» - это панель поиска.Я использую слой в качестве примера, но реальная цель - оживить его ширину, но проблема происходит со всем. Все, что я хочу оживить, не будет анимировать вообще, независимо от того, находится ли оно в подклассе или если оно находится в контроллере представления. Это самая странная вещь. – Maximilian

+0

@Maximilian вы пытаетесь совершить анимацию при нажатии кнопки отмены UISearchBar? – soulshined

+0

Его не UISearchBar, его обычная, но да. Когда кнопка отмены нажата, я хочу сделать анимацию. – Maximilian

0

Попробуйте

[UIView animateWithDuration:5.0 animations:^{ 
     CGRect addressBarFrame = barItem.customView.frame; 
     addressBarFrame.size.width = 200; 
     barItem.customView.frame = addressBarFrame; 
    } completion:^(BOOL finished) { 
     NSLog(@"COMPLETION!"); 
    }]; 

или это

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:5.0]; 
CGRect addressBarFrame = barItem.customView.frame; 
addressBarFrame.size.width = 200; 
barItem.customView.frame = addressBarFrame; 
[UIView commitAnimations]; 
+0

Я не мог смотреть видео, но для быстрого обзора, я думаю, вы ошибаетесь в последовательности кода анимации. – NewStackUser

+0

Оба не работают, происходит мгновенно. Также не получилось бы работать, потому что вам нужно установить barItem.width, а также настраиваемый кадр представления, но даже с установкой ширины с этим кодом тоже не работает: [Это так странно. – Maximilian

+0

можете ли вы поделиться снимками экрана? – NewStackUser

0

Вы пишите [UIView setAnimationsEnabled:NO]; Проверьте в вашем коде. Иногда это создает проблему с анимацией UIView.

Смежные вопросы