Iphone SDK - Анимация Subview - PullRequest
3 голосов
/ 29 мая 2009

У меня есть представление с UIWebView и панель параметров (пользовательский UIViewController с настраиваемым представлением).

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

В ПЕРВЫЙ раз, когда отображается представление, панель параметров, кажется, уже видна ... Когда я нажимаю BACK на моем navController и снова поднимаю View, анимация работает отлично.

Может кто-нибудь пролить свет на эту тему?

- (void)viewDidLoad {
    [super viewDidLoad];
    optionsPane=[[OptionsPaneController alloc] initWithNibName:@"OptionsPane" bundle:nil];
}

- (void)viewWillAppear:(BOOL)animated {

    [optionsPane.view removeFromSuperview];
    [self checkOptionsVisible];
}

-(void)checkOptionsVisible{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[optionsPane view] cache:YES];
    [[self view] addSubview:[optionsPane view]];
    [theWebView setFrame:CGRectMake(0,87,320,230)];
    [[optionsPane view] setFrame:CGRectMake(0,0,320,87)];
    [UIView commitAnimations];      
}

Ответы [ 4 ]

1 голос
/ 29 мая 2009

Хм, я не думаю, что сообщение viewWillAppear отправляется в первый раз. В SDK я читаю две вещи. Вы должны позвонить super внутри этого сообщения, и к вашему первому обращению может появиться большое предупреждение:

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

В конечном счете, я бы запустил отладчик и убедился, что сообщение viewWillAppear отправляется, когда вы думаете, что это так.

0 голосов
/ 04 июня 2009

Свойство view в UIViewController загружается лениво - даже когда вы начинаете с nib, как вы здесь, само представление фактически не создается до тех пор, пока не будет получен первый доступ к свойству.

Трудно точно знать, что происходит, не видя больше кода, но вы можете получить желаемые результаты, если зайдете в optionsPane.view в viewDidLoad (вам не нужно ничего с этим делать, просто вызовите свойство для принудительной загрузки ).

0 голосов
/ 03 июня 2009

Если я понимаю, что вы объясняете, у меня была очень похожая проблема на днях.

При первой загрузке происходит то, что viewDidLoad запускается первым. загрузка файла пера занимает немного больше времени, чем требуется самому viewWillAppear для запуска.

То, что мы получаем, это загрузка пера после того, как viewWillApper уже удалился.

При любой загрузке после этого viewDidLoad не будет запускаться, позволяя viewWillAppear выполнять свою работу по верному переключению.

Что делать?
Сначала попробуйте изменить свой код, чтобы использовать «viewDidAppear». Это должно помочь, но вы должны посмотреть, хорошо ли это выглядит.

Другой вариант (я знаю, что он уродливый) - это вызов метода checkOptionsVisible для viewDidLoad.
Если бы не эта помощь, я бы посчитал таймер хаком - если требования позволяют это.

Я надеюсь, что это поможет вам решить проблему.

0 голосов
/ 03 июня 2009

Обновлено для вашей ситуации:

Вместо этого есть четыре вида:

  1. Вид сзади

  2. Основной вид

  3. Вид сзади (панель параметров) 100 пикселей

  4. Вид спереди (пустой вид) 100 пикселей

Добавьте основной вид к заднему виду как обычно.

Добавьте вид спереди в вид сзади, где вы хотели бы, чтобы отображалась панель параметров.

убедитесь, что вид спереди и сзади имеют одинаковую рамку.

Используйте тот же код, что и ниже, используя методы переворачивания вида спереди и сзади.


Оригинальный ответ

Вам нужно 3 просмотра:

  1. Вид сзади

  2. Вид спереди

  3. вид сзади

Задний вид просто удерживает остальные 2, когда они переворачиваются назад и вперед. Ниже приведены методы переворачивания. Я помещаю их обоих в backingViewController:

- (void)displayBack{

    //parent controller is an ivar so the sub-view controllers know who their daddy is
    backController.parentController = self;


    [UIView beginAnimations:nil context:@"flipTransitionToBack"];
    [UIView setAnimationDuration:1.2];

    //note self.view IS the backing view
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];

    //remove the front view
    [[frontController view] removeFromSuperview];
    //add the back view view
    [self.view addSubview:[backController view]];
    [UIView commitAnimations];

    //giving a heads up to the view that is about to come on screen
    [backController viewWillAppear:YES];

}



- (void)displayFront{

    [UIView beginAnimations:nil context:@"flipTransitionToFront"];
    [UIView setAnimationDuration:1.2];

    [UIView setAnimationDelegate:self];

    //I'm interested in knowing this has happened
    [UIView setAnimationDidStopSelector:@selector(flipAnimationDidEndWithID:finished:context:)];

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
    //remove back view
    [[backController view] removeFromSuperview];
    //add the front view
    [self.view addSubview:[frontController view]];
    [UIView commitAnimations];

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