iOS UIView Ошибка анимации setFrame - PullRequest
2 голосов
/ 30 января 2012

У меня странная ошибка при анимации пары представлений в iOS.Моя цель - переключиться с пользовательского «Разделенного вида».Вы можете увидеть, что происходит в этом видео на YouTube: http://youtu.be/ZWbf2bQYMns

Вы можете увидеть странный «удар» в значении Y UIImageView, и мне было интересно, как это исправить для довольнонекоторое время.

Это интерфейс View Controller:

@interface VideoSharing_Pad : UIViewController
{   
    IBOutlet UIView *videoCallView;
    IBOutlet UIImageView *imageView;  //This is "inside" mediaView
    IBOutlet UIView *mediaView;
    CGRect mediaRect;
    CGRect videoCallRect;
    CGRect imageRect;
}

В viewDidLoad я сохраняю оба представления следующим образом:

//Get frames from XIB
mediaRect = mediaView.frame;
videoCallRect = videoCallView.frame;
imageRect = imageView.frame;

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

- (IBAction)toggleFullScreen:(id)sender 
{
    if (iScreenMode == callAndShareMedia) {
        CGRect fullScreenRect = CGRectMake(0, 0, 1024, 768);
        CGRect dissapearRect = CGRectMake(0, - videoCallView.bounds.size.height, videoCallView.bounds.size.width, videoCallView.bounds.size.height);

        [UIView animateWithDuration:1.0
                              delay:0.1
                            options: UIViewAnimationCurveEaseOut
                         animations:^{

                             [videoCallView setFrame:dissapearRect];
                             [imageView setFrame:fullScreenRect];
                             [mediaView setFrame:fullScreenRect];
                         } 
                         completion:^(BOOL finished){

                         }];

        iScreenMode = onlyShareMedia;
        return;
    } 
    else if (iScreenMode == onlyShareMedia)
    {

        [UIView animateWithDuration:1.0
                              delay:0.1
                            options: UIViewAnimationCurveEaseOut
                         animations:^{

                             [videoCallView setFrame:videoCallRect];
                             [mediaView setFrame:mediaRect];
                             [imageView setFrame:imageRect];  

                         } 
                         completion:^(BOOL finished){    
                         }];
        iScreenMode = callAndShareMedia;
        return;
    }     
}

Я был бы очень признателен за любую помощь, которую я могу получить.Большое спасибо!

это скриншот XIB:

enter image description here

, как вы можете видеть на скриншоте и в файле .h, imageView находится внутриUIView, называемый mediaView, Другой UIView, videoCallView - это тот, у которого есть три фиктивных изображения.

Ответы [ 2 ]

1 голос
/ 31 января 2012

Действительно интересный вопрос. Это определенно связано с анимацией суперпредставления и подпредставления одновременно. Я сделал образец программы, и воспроизвел похожую ситуацию.

Мой обходной путь - избегать анимации суперпредставления (mediaView) и расширять только подпредставление (imageView) до полного прямоугольника. Поскольку ваше суперпредставление (mediaView) не имеет большого количества, оно не должно давать столь различного опыта пользователя.

Итак, вместо

[UIView animateWithDuration:1.0
                      delay:0.1
                    options: UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     [videoCallView setFrame:dissapearRect];
                     [imageView setFrame:fullScreenRect];
                     [mediaView setFrame:fullScreenRect];
 }];

Вы можете сделать

[UIView animateWithDuration:1.0
                      delay:0.1
                    options: UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     [videoCallView setFrame:dissapearRect];
                     [imageView setFrame:(CGRect){fullScreenRect.origin.x - mediaRect.origin.x, fullScreenRect.origin.y - mediaRect.origin.y, fullScreenRect.size}];
 }];

Для возврата в нормальный режим вы можете просто проигнорировать mediaView анимацию. Возможно, вы хотите переместить (анимировать) кнопку toggleButton вместе с другой анимацией.

@ Ответ jrturton (вторая часть) казался хорошим обходным путем, но он не работал с моим примером кода. Это работало на пути, чтобы пойти (расширение), но натолкнулось на путь назад (сокращение), по причине, которую я не знаю почему. Но не отклоняйте его ответ из-за моего комментария, это может быть я.

0 голосов
/ 31 января 2012

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

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

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

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