Анимация фрейма UIView, подпредставление UIScrollView не всегда анимирует - PullRequest
6 голосов
/ 11 июля 2011

В это пример.

Я анимирую кадр PhotoViewerViewController, когда я анимирую tabBarController (для полноэкранного эффекта). PhotoViewer использует uiscrollview для создания того же эффекта, что и приложение Apple для фотографий. По какой-то причине иногда он анимируется вместе с моим кадром PhotoViewer, а иногда нет.

В первом примере вы видите, что он скачет при увеличении размера кадра, но хорошо анимируется при уменьшении размера кадра (и восстановлении панели вкладок).

Однако в этом примере, когда фотография расположена вертикально, она прыгает в обоих направлениях.

В обоих случаях, если я вообще увеличиваю фотографию с помощью прокрутки, она корректно анимируется в обоих направлениях.

Я знаю, что доказательства есть, но я не могу понять, что здесь происходит.

Вот мой блок анимации:

void (^updateProperties) (void) = ^ {
    self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f;
    self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f;
    if (self.tabBarController) {

        int height = self.tabBarController.tabBar.bounds.size.height;
        for(UIView *view in self.tabBarController.view.subviews)
        {
            int newHeight;
            UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
            if (UIInterfaceOrientationIsPortrait(orientation)) {
                newHeight = hidden ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.height - height;
            } else {
                newHeight = hidden ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.width - height;
            }


            if([view isKindOfClass:[UITabBar class]])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, newHeight, view.frame.size.width, view.frame.size.height)];
            } 
            else 
            {
                CGRect newFrame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, newHeight);
                [view setFrame:newFrame];

                // update our VC frame with animation
                [self.view setFrame:newFrame];

            }

        }
    }

};

Код, адаптированный из поста на SO: UITabBar не будет скрывать

Полный источник на github .

Ответы [ 2 ]

6 голосов
/ 14 июля 2011

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

В частном случае UIScrollView часто случается, что -layoutSubviews вызывается без анимации через один цикл выполнения после закрытия блоков анимации. По этой причине я обычно стараюсь избегать создания любого макета в этом методе, где у меня есть UIScrollView в иерархии представлений (потому что особенно до iOS 5, UIScrollView действительно рад при настройке на необходимость использования макета).

Я бы порекомендовал удалить ваш звонок на -[EGOPhotoImageView layoutScrollViewAnimated:] из -layoutSubviews и вместо этого добавить его в переопределенный -setFrame:.

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

0 голосов
/ 14 июля 2011

Я попробовал ваш код github на симуляторах iPad 4.2 и 4.3, и он работает нормально ... без изменения размера изображения Там могут быть некоторые проблемы с версией. Кроме того, я попытался изменить ваш блок анимации, и следующее служит той же цели:

void (^updateProperties) (void) = ^ {
            self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f;
            self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; }

Дайте мне знать, если я что-то упустил :)

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