Как добавить анимацию при изменении скрытого режима просмотра? - PullRequest
42 голосов
/ 30 мая 2011

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

my_view.hidden=YES;

Я добавил кнопку на панели навигации.Когда мы нажимаем на него, новый вид становится невидимым.Он рисует в верхней части навигационной таблицы.

Ответы [ 12 ]

54 голосов
/ 30 мая 2011

Анимация прозрачности представления от 100% до 0%.Сделайте так, чтобы обратный вызов завершения анимации устанавливал вид скрытым.Возможно, вы также захотите сбросить непрозрачность обратно до 100% во время обратного вызова, поэтому представление будет отображаться полностью непрозрачным, когда вы его отобразите.

yourView.alpha = 0.0 //for zero opacity
yourView.alpha = 1.0 //for 100% opacity
30 голосов
/ 17 октября 2014

Анимации для сокрытия нет;вы получите тот же результат с кодом Swift ниже:

UIView.animate(withDuration: 0.2, delay: 0, options: [], animations: {            
    self.yourView.alpha = 0 // Here you will get the animation you want
}, completion: { _ in  
    self.yourView.hidden = true // Here you hide it when animation done
})
29 голосов
/ 30 мая 2011

К сожалению, скрытое не является свойством, которое можно анимировать с помощью анимации UIView. Я думаю, что вам лучше всего использовать одну из предложенных @Erik B анимаций или начать играть с Core Animations, которые намного мощнее. Взгляните на документацию по анимациям UIView и Core Animations.

Я достиг чего-то похожего на то, что вы предлагаете, используя анимацию UIView для перемещения нового представления из-под другого представления. Это сделало его похожим на выдвижной ящик. Если вы хотите сделать что-то подобное, вам нужно перехватить событие «touch up» внутри и поместить туда код анимации.

- (IBAction)buttonClicked:(id)sender {
    [UIView animateWithDuration:0.5
                          delay:0.0 
                        options:UIViewAnimationCurveEaseOut
                     animations:^(void) {
                        self.myView.frame = /* set the frame here */
                     } 
                     completion:NULL];
}
19 голосов
/ 08 декабря 2016

Обновлено до Swift 3 :

UIView.animate(withDuration: 0.2, delay: 0.2, options: .curveEaseOut,
      animations: {firstView.alpha = 0}, 
      completion: { _ in firstView.isHidden = true
        //Do anything else that depends on this animation ending
    })

И если вы хотите оживить что-то после исчезновения первого просмотра, вы можете повторить код внутри блока завершения с помощью alpha = 1 и hidden = false.

19 голосов
/ 12 марта 2015

Я думаю, что более подходящий способ сделать это:

[UIView transitionWithView:aView
                  duration:0.3
                   options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^(void){
                              aView.hidden = NO;
                           }
                completion:nil];
18 голосов
/ 04 января 2013

Вот категория, которую я написал, чтобы ввести новое скрытое свойство в UIView, которое правильно поддерживает анимацию:

@implementation UIView (AnimateHidden)

-(void)setHiddenAnimated:(BOOL)hide
{
  [UIView animateWithDuration:0.5
                        delay:0.0
                      options: UIViewAnimationCurveEaseOut
                   animations:^
                             {
                           [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                           if (hide)
                             self.alpha=0;
                           else
                           {
                             self.hidden= NO;
                             self.alpha=1;
                           }
                         }
      completion:^(BOOL b)
      {
        if (hide)
          self.hidden= YES;
      }
  ];
}
@end
9 голосов
/ 27 мая 2013

Исправлено Н.Дж. версия:

@implementation UIView (AnimateHidden)

-(void)setHiddenAnimated:(BOOL)hide duration:(NSTimeInterval)duration {
    if(self.hidden == hide)
        return;
    if(hide)
        self.alpha = 1;
    else {
        self.alpha = 0;
        self.hidden = NO;
    }
    [UIView animateWithDuration:duration animations:^{
        if (hide)
            self.alpha = 0;
        else
            self.alpha = 1;
    } completion:^(BOOL finished) {
        if(finished)
            self.hidden = hide;
    }];
}

@end
6 голосов
/ 19 июля 2016

Вот быстрая версия для этого:

 UIView.animateWithDuration(0.5, delay: 0.2, options:
    UIViewAnimationOptions.CurveEaseOut, animations: {
            objView.alpha = 0
        }, completion: { finished in
            objView.hidden = true
  })

Выполняется анимация продолжительностью 5 секунд и с задержкой в ​​2 секунды.

Доступные варианты анимации:

CurveEaseInOut, CurveEaseIn, CurveEaseOut, CurveLinear
3 голосов
/ 07 сентября 2014

Поскольку некоторые из этих ответов немного загромождены, я решил опубликовать свой минималистичный дизайн этого API.Я также добавил задержку и продолжительность - потому что, почему бы и нет.

В реализации у нас есть.

#import "UIView+AnimateHidden.h"

@implementation UIView (AnimateHidden)

- (void)setHiddenAnimated:(BOOL)hide
                    delay:(NSTimeInterval)delay
                 duration:(NSTimeInterval)duration {
    [UIView animateWithDuration:duration
                          delay:delay
                        options:UIViewAnimationOptionAllowAnimatedContent
                     animations:^{
                         if (hide) {
                             self.alpha = 0;
                         } else {
                             self.alpha = 0;
                             self.hidden = NO; // We need this to see the animation 0 -> 1
                             self.alpha = 1;
                         }
    } completion:^(BOOL finished) {
        self.hidden = hide;
    }];
}

@end

В файле header мыиметь.

#import <UIKit/UIKit.h>

@interface UIView (AnimateHidden)

- (void)setHiddenAnimated:(BOOL)hide
                    delay:(NSTimeInterval)delay
                 duration:(NSTimeInterval)duration;

@end
3 голосов
/ 19 декабря 2013

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

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

UIView + AnimateHidden.m

#import "UIView+AnimateHidden.h"

@implementation UIView (AnimateHidden)

- (void)setHidden:(BOOL)hidden animated:(BOOL)animated
{
    // If the hidden value is already set, do nothing
    if (hidden == self.hidden) {
        return;
    }
    // If no animation requested, do the normal setHidden method
    else if (animated == NO) {
        [self setHidden:hidden];
        return;
    }
    else {
        // Store the view's current alpha value
        CGFloat origAlpha = self.alpha;

        // If we're unhiding the view, make it invisible initially
        if (hidden == NO) {
            self.alpha = 0;
        }

        // Unhide the view so we can see the animation
        self.hidden = NO;

        // Do the animation
        [UIView animateWithDuration:0.5
                              delay:0.0
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^{
            // Start animation block
            if (hidden == YES) {
                self.alpha = 0;
            }
            else {
                self.alpha = origAlpha;
            }
            // End animation block
        }
                        completion:^(BOOL b){
            // Start completion block
            // Finish up by hiding the view if necessary...
            self.hidden = hidden;
            // ... and putting back the correct alpha value
            self.alpha = origAlpha;
            // End completion block
        }];
    }
}

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