Collection<T>
настраиваемая обертка [приблизительно 111]. В то время как IList<T>
не изолируется, это не обеспечивает точек настройки. Collection<T>
методы по умолчанию делегированы к стандарту IList<T>
методы, но могут быть легко переопределены, чтобы сделать то, что Вы хотите. Это также возможно к wireup событиям в Collection<T>
, что я не верю, мог быть сделан с IList.
Короче говоря, намного легче расширить его после факта, который мог потенциально означать намного меньше рефакторинга.
Что вы можете сделать, так это нажать следующий контроллер представления, но не анимировать его, например:
[self.navigationController pushViewController:nextController animated:NO];
... а затем, в вставляемом контроллере представления, вы может создавать пользовательскую анимацию своего вида с помощью CoreAnimation. Лучше всего это сделать с помощью метода viewDidAppear: (BOOL) animated
.
Ознакомьтесь с Core Animation Guide , чтобы узнать, как на самом деле делать анимацию. Обратите особое внимание на неявную анимацию.
РЕДАКТИРОВАТЬ: обновленная ссылка
Все, что вам нужно, - это загрузить главу 2 из кулинарной книги разработчиков iphone . Посмотрите конкретно на пример affineRotate, хотя вам поможет любой из основных образцов аниматина.
Я использую следующую функцию (добавленную в UINavigationController
) для настройки анимации push:
- (void) pushController: (UIViewController*) controller
withTransition: (UIViewAnimationTransition) transition
{
[UIView beginAnimations:nil context:NULL];
[self pushViewController:controller animated:NO];
[UIView setAnimationDuration:.5];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationTransition:transition forView:self.view cache:YES];
[UIView commitAnimations];
}
Думаю, вы можете адаптировать этот код для выполнения любой анимации, какой захотите.
@zoul: Отлично сработало! Я просто изменил «self» на «self.navigationController» и «self.view» на «self.navigationController.view» Не знаю, было ли это необходимо, но это сработало. А @crafterm, что касается возврата, просто создайте свой собственный leftBarButtonItem, добавив этот код в viewDidLoad или ViewWillAppear:
//add your own left bar button
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)];
self.navigationItem.leftBarButtonItem = backButton;
[backButton release];
Затем я просто настроил функцию push и сделал эту функцию popWithTransition, которую я вызвал в моем методе -backButtonTapped.
- (void) popWithTransition: (UIViewAnimationTransition) transition
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.75];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES];
[UIView commitAnimations];
[self.navigationController popViewControllerAnimated:NO];
}
Обратите внимание, что вызов popViewController был сдвинут в конец после анимации. Не знаю, кошерно ли это, но опять же, это сработало.