如何在 iPhone 中隐藏/显示带有动画的 UIView

Posted

技术标签:

【中文标题】如何在 iPhone 中隐藏/显示带有动画的 UIView【英文标题】:How to hide/show UIView with animation in iPhone 【发布时间】:2013-08-23 05:48:04 【问题描述】:

我想在按钮按下动画后显示 UIView,我可以显示视图,但我无法再次按下该按钮隐藏它。这是我显示/隐藏视图的代码。 显示 UIView :

    sliderView.frame =  CGRectMake(130, 20, 0, 0);
    [UIView animateWithDuration:0.25 animations:^
    sliderView.frame =  CGRectMake(130, 30, 100, 200);
    ]; 

隐藏 UIView :

     [UIView animateWithDuration:0.25 animations:^
     sliderView.frame =  CGRectMake(130, 30, 0, 0);
    ]; 

使用上面的代码视图显示动画但不隐藏。 有人知道怎么隐藏吗,请帮忙,谢谢

【问题讨论】:

您发布的代码应该将sliderView 缩小到零。现在实际发生了什么?你没有告诉我们真正的问题是什么。 我已经编辑了我的问题。 该代码如何显示视图?它将框架的宽度和高度缩小为 0。您确定正在调用隐藏视图的代码吗? 你在哪里调用这些方法?紧随其后或发生某些事件?两次调用中的 sliderView 是同一个对象吗? 检查你是否隐藏调用的动作 【参考方案1】:

您的代码有效,我已使用它。看看下面的代码 .h 文件:

#import <UIKit/UIKit.h>

@interface ***TestViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIView *cautionView;


- (IBAction)btnToggleClick:(id)sender;
@property (strong, nonatomic) IBOutlet UIButton *btnToggle;
@end

.m 文件:

#import "***TestViewController.h"

@interface ***TestViewController ()

@end

@implementation ***TestViewController

bool isShown = false;

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (IBAction)btnToggleClick:(id)sender 
    if (!isShown) 
        _cautionView.frame =  CGRectMake(130, 20, 0, 0);
        [UIView animateWithDuration:0.25 animations:^
            _cautionView.frame =  CGRectMake(130, 30, 100, 200);
        ];
        isShown = true;
     else 
        [UIView animateWithDuration:0.25 animations:^
            _cautionView.frame =  CGRectMake(130, 30, 0, 0);
        ];
        isShown = false;
    

@end

【讨论】:

谢谢Binh Lee,另外我想在那个UIView上添加Imageview,所以我可以像UIView一样改变imageview的框架吗?? 没问题的人,(1).你可以将 ImageView 添加到那个 UIView 并在那个 UIView 上更改框架 (2) 用 ImageView 更改上面的 UIView 没有问题 @BinhLee 我正在为您的代码使用 _cautionView 动画。我确实在那个 _cautionView 中添加了两个 UILabel。该标签在动画时不会隐藏。【参考方案2】:
  -(void)fadeInAnimation:(UIView *)aView 

    CATransition *transition = [CATransition animation];
    transition.type =kCATransitionFade;
    transition.duration = 0.5f;
    transition.delegate = self;
    [aView.layer addAnimation:transition forKey:nil];
    

Add Subview:

     [self.view addsubView:mysubview]; 
     [self fadeInAnimation:self.view];

Remove SubView:

      [mySubView removefromSuperView];   
      [self fadeInAnimation:self.view];

【讨论】:

【参考方案3】:

你可以使用 UIView 的 alpha 属性和 hidden 属性来隐藏你的 sliderView。试试下面的代码:

/*To unhide*/
[sliderView setHidden:NO];
sliderView.frame =  CGRectMake(130, 20, 0, 0);
[UIView animateWithDuration:0.25 animations:^
    sliderView.frame =  CGRectMake(130, 30, 100, 200);
    sliderView.alpha = 1.0f;
 completion:^(BOOL finished) 
];

/*To hide*/
[UIView animateWithDuration:0.25 animations:^
    sliderView.frame =  CGRectMake(130, 30, 0, 0);
    [sliderView setAlpha:0.0f];
 completion:^(BOOL finished) 
    [sliderView setHidden:YES];
];

【讨论】:

这对我有用 .. 如果您使用故事板,您可以添加一个 uiview 并根据需要调整其大小。如果是这样,您可以删除 sliderView.frame 的 CGRectMake 值【参考方案4】:

试试这个

- (IBAction)eventparameter:(id)sender

    if ([self.parameterview isHidden])
    
        [UIView beginAnimations:@"LeftFlip" context:nil];
        [UIView setAnimationDuration:0.8];
        _parameterview.hidden=NO;
        [UIView setAnimationCurve:UIViewAnimationCurveLinear];
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown    forView:_parameterview cache:YES];
        [UIView commitAnimations];   
    
    else
    
        [UIView transitionWithView:_parameterview
                          duration:0.4
                           options:UIViewAnimationOptionTransitionCurlUp
                        animations:NULL
                        completion:NULL];

        [self.parameterview  setHidden:YES]; 
    

【讨论】:

【参考方案5】:

试试这个:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.25];
[sliderView setFrame:CGRectMake(130, 30, 0, 0)];
[UIView commitAnimations];

【讨论】:

这些都是旧的和过时的。 Apple 建议您使用块版本(如原始问题所示)。【参考方案6】:

应用你视图的初始/起始帧

sliderView.frame =  CGRectMake(130, 480, 100, 200);

给你的按钮标签,比如

myButton.tag = 101;

还有你的按钮方法

-(void)MyButonMethod:(UIButton *)sender

  if(sender.tag == 101)
  
    [UIView animateWithDuration:0.25 animations:^
         sliderView.frame =  CGRectMake(130, 30, 100, 200);
    ]; 

    sender.tag = 102;
  
  else
  
    [UIView animateWithDuration:0.25 animations:^
         sliderView.frame =  CGRectMake(130, 480, 100, 200);
    ];     
    sender.tag = 101;  
  

【讨论】:

以上是关于如何在 iPhone 中隐藏/显示带有动画的 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中隐藏带有动画的状态栏?

如何在滚动时隐藏并显示带有动画效果的标题视图

如何在 iOS 13 中隐藏带有动画的标签栏?

iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画

如何使用 React-Transition-Group 显示和隐藏带有动画的模态/对话框?

我正在使用带有 WebView 的 LinearProgressIndicator 来显示网页渲染进度,当进度动画达到 100 时如何隐藏它?