如何在更改uiview的隐藏模式时添加动画?

San*_*ush 45 animation button uiview navigationbar ios

我想在更改其隐藏模式时向视图添加动画,即

my_view.hidden=YES;
Run Code Online (Sandbox Code Playgroud)

我在导航栏中添加了一个按钮.当我们点击它时,新视图被设置为取消隐藏.它绘制在导航表的上方.

Jer*_*man 57

将视图的不透明度从100%设置为0%.让动画完成回调将视图设置为隐藏.您可能还希望在回调期间将不透明度重置为100%,因此当您取消隐藏时,视图将显示完全不透明.

yourView.alpha = 0.0 //for zero opacity
yourView.alpha = 1.0 //for 100% opacity
Run Code Online (Sandbox Code Playgroud)


小智 31

但是没有隐藏的动画; 使用下面的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
})
Run Code Online (Sandbox Code Playgroud)


Eyt*_*tan 29

不幸的是,隐藏不是通过UIView动画可动画的属性.我认为你最好的选择可能是使用@Erik B建议的其中一个动画,或者开始涉足更强大的Core Animations.浏览UIView动画和核心动画的文档.

通过使用UIView动画从另一个视图下方滑动新视图,我实现了类似于您的建议.这使它看起来像一个抽屉滑出.如果你想做类似的事情,你需要拦截内部事件的触摸并将动画代码放在那里.

- (IBAction)buttonClicked:(id)sender {
    [UIView animateWithDuration:0.5
                          delay:0.0 
                        options:UIViewAnimationCurveEaseOut
                     animations:^(void) {
                        self.myView.frame = /* set the frame here */
                     } 
                     completion:NULL];
}
Run Code Online (Sandbox Code Playgroud)

  • 选项应该是:`UIViewAnimationOptionCurveEaseInOut` (2认同)

小智 20

我认为更合适的方法是:

[UIView transitionWithView:aView
                  duration:0.3
                   options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^(void){
                              aView.hidden = NO;
                           }
                completion:nil];
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,不需要弄乱alpha.我整理了它,所以它更清晰. (7认同)

Pau*_*fel 20

更新到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
    })
Run Code Online (Sandbox Code Playgroud)

如果你希望在第一个视图消失后回复一些东西,你可以使用alpha = 1和复制完成块内的代码hidden = false.


N.J*_*.J. 18

这是我写的一个类别,用于在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
Run Code Online (Sandbox Code Playgroud)


Sta*_*tan 9

这是更正NJ版本:

@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
Run Code Online (Sandbox Code Playgroud)


Jay*_*bey 6

这是快速版本:

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

这将执行持续时间为5秒且延迟2秒后的动画.

可用的AnimationOptions是:

CurveEaseInOut, CurveEaseIn, CurveEaseOut, CurveLinear
Run Code Online (Sandbox Code Playgroud)