如何动画在Xcode一个UIView的宽度和高度?(How to animate the width

2019-08-01 09:21发布

我有这样子视图我想要添加到我的主要观点,但使它从原点展开。 我看了一些苹果的文档,但我不明白的地方,我会犯错。 我可以动画坐标系的原点,即得到它随时随地在下滑,但宽度/高度似乎没有动画。 代码如下:

[UIView beginAnimations:@"animateAddContentView" context:nil];
[UIView setAnimationDuration:0.4];
customView.frame= CGRectMake(self.view.frame.origin.x +5, self.view.frame.origin.y +5, 0, 150);
[self.view addSubview:customView];

customView.frame= CGRectMake(self.view.frame.origin.x +5, self.view.frame.origin.y +5, 310, 150);
[UIView commitAnimations];

我也试图把只有SETFRAME部分在这样的动画:

customView.frame= CGRectMake(self.view.frame.origin.x +5, self.view.frame.origin.y +5, 0, 150);
[self.view addSubview:customView];
[UIView beginAnimations:@"animateAddContentView" context:nil];
[UIView setAnimationDuration:0.4];
customView.frame= CGRectMake(self.view.frame.origin.x +5, self.view.frame.origin.y +5, 310, 150);
[UIView commitAnimations];

但它仍然无法正常工作!

编辑:

按照建议,我已经把它移到一个基于块的动画解决方案,这是确切的代码:

NSLog(@"yourview : %@",customView);
customView.frame= CGRectMake(self.view.frame.origin.x +5, self.view.frame.origin.y +5, 0, 150);

NSLog(@"yourview : %@",customView);
[self.view addSubview:customView];
NSLog(@"yourview : %@",customView);

//    [customView setFrame:CGRectMake( 0.0f, 480.0f, customView.frame.size.width, customView.frame.size.height)];

[UIView animateWithDuration:0.4
                      delay:0
                    options:UIViewAnimationCurveEaseInOut
                 animations:^ {
                     NSLog(@"yourview : %@",customView);

                     customView.frame = CGRectMake(self.view.frame.origin.x +5, self.view.frame.origin.y +5, 310, 150);
                     NSLog(@"yourview : %@",customView);

                 }completion:^(BOOL finished) {

                 }];

这仍然没有出于某种原因。 我看到可能的问题是:

  1. 我从一个加载此customView nib特异性310是150,也许这是造成问题。
  2. 我不输入正确的框架,但因为我可以动画这个观点的frame.origin部分,我不知道是这样的话......我有QuartzCoreCore Graphics全部采用进口和东西。

在日志中的每个点这是给那些正确的东西:例如,目标帧之前的大小为0,150,之后我设置帧的310,150。但动画不能正常工作!

Answer 1:

为了使视图“成长”到位,别动画帧。 动画变换。

从笔尖装入子视图。 设置其转换为0分:

view.transform = CGAffineTransformMakeScale(0,0);

然后将其添加到您的上海华。

里面的动画块,设置的转换身份:

view.transform = CGAffineTransformIdentity;

和视图将增长到正常大小。 您可能需要锚点摆弄,使其从右边点增长。

您还可以更改块内的框架,但移动视图只有我喜欢改变中心的财产,你不应该尝试设置框,如果你也有一个转变。

对于加分,还可以动画到略大于1.0的规模,然后进行动画处理回身份从完成块链式动画变换。 这使得视图“啪”出像一个警报视图的画面。



Answer 2:

尝试使用块会更清晰。

 // First create the view if you haven't already 
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)]; 
// Add it as a subview. 
[myViewController.view addSubview:myView]; 


CGRect newFrameOfMyView = CGRectMake(0.0f, 0.0f, 200.0f, 200.0f); 
/*
 * Alternatively you could just set the width/height or whatever you'd like with this: 
 * CGRect newFrameOfMyView = myView.frame; 
 * newFrameOfMyView.size.height = 200.0f; 
 * newFrameOfMyView.size.width = 200.0f; 
 */
[UIView animateWithDuration:0.3f
     animations:^{
      myView.frame = newFrameOfMyView; 
     }
     completion:^(BOOL finished){ 
     NSLog( @"woo! Finished animating the frame of myView!" ); 
}];


Answer 3:

试试这个:

customView.frame= CGRectMake(self.view.frame.origin.x +5,self.view.frame.origin.y+5,0, 150);
[self.view addSubview:customView];
CGRect frame = customView.frame;
frame.size.width = 310;
[UIView animateWithDuration:0.4
 animations:^{
  customView.frame= frame; 
 }];

或者,如果你想使用beginAnimation方法,而不是块Methos,使用此:

UIView *customView=[[UIView alloc]initWithFrame:CGRectMake(self.view.frame.origin.x +5,self.view.frame.origin.y+5,0, 150)];
[self.view addSubview:customView];
CGRect frame = customView.frame;
frame.size.width = 310;
[UIView beginAnimations:@"animateAddContentView" context:nil];
[UIView setAnimationDuration:0.4];
customView.frame= frame;
[UIView commitAnimations];


Answer 4:

这是动画你的观点的一个有趣的方式。 在我的例子,我有一个触摸动作将执行块动画和BOOL,以确保大家的意见重置回其原始状态。

首先你把一个UIViewController(你可以将它们上色不同的颜色供对比)2个UIViews。 将其连接到你的“MainViewController.h”文件创建控制大视图。 .h文件应该是这样的:

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIView *topView;
@property (weak, nonatomic) IBOutlet UIView *bottomView;

@end

和你.m文件应该是这样的:

#import "MainViewController.h"
#define kViewAnimateWithDuration 0.35f
#define kViewDelay 0.05f

@interface MainViewController ()
@property (nonatomic) BOOL setTouch;
@end

@implementation MainViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.setTouch = NO;
    }
    return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    float width_tp = self.topView.frame.size.width;
    float height_tp = self.topView.frame.size.height;

    float width_b = self.bottomView.frame.size.width;
    float height_b = self.bottomView.frame.size.height;

    if ((CGRectContainsPoint(self.bottomView.frame, touchLocation)) && !self.setTouch){

        [UIView animateWithDuration:kViewAnimateWithDuration
                              delay:kViewDelay
                            options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                         animations:^{
                             //Move frame or transform view
                             [self.topView setFrame:CGRectMake(self.topView.frame.origin.x, self.topView.frame.origin.y, width_tp, height_tp + 171)];

                             [self.bottomView setFrame:CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y +171, width_b, height_b -171)];

                         } completion:^(BOOL finished) {
                             self.setTouch = YES;
                         }];



    }
    if ((CGRectContainsPoint(self.bottomView.frame, touchLocation)) && self.setTouch) {
        [UIView animateWithDuration:kViewAnimateWithDuration
                              delay:kViewDelay
                            options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                         animations:^{
                             //Move frame or transform view
                             [self.topView setFrame:CGRectMake(self.topView.frame.origin.x, self.topView.frame.origin.y, width_tp, height_tp - 171)];

                             [self.bottomView setFrame:CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y -171, width_b, height_b +171)];

                         } completion:^(BOOL finished) {
                             self.setTouch = NO;
                         }];
    }

}

因此,只要确保冠捷有一些小的尺寸如x:0,Y:0宽度:320高度:43和bottomView如x:0 Y:40宽度:320高度:528。 记住颜色的背景不同的颜色。 然后,只需运行该程序,你应该看到动画。

对于我我认为在代码比较重要的线中的一条是SETFRAME:对我能够自动地重新显示矩形,而不必使用drawRect方法的帧。 设置属性改变由中心属性,并以相应的边界矩形大小指定的点。

当然,还有其他有趣的方式来做到这一点,但我希望这可以帮助别人完成iOS看起来不可思议像它应该是! 快乐旅程!



Answer 5:

要点

1)您parentView添加视图动画之前,与起始帧。

2)然后,只需给动画块内的目标帧

你不再需要这个,因为你是从笔尖添加视图..

//UIVIew yourView  = [[UIView alloc] initWithFrame:YOUR_STARTING_FRAME];
//[self.view addSubview:yourView];

.........
.........
.........

只是给您观看动画代码..确保yourView不为零(在我看来是这样。)

NSLog(@"yourview : %@",yourView);
[UIView animateWithDuration:your_duration 
                      delay:your_starting_delay 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^ {
                     yourView.frame = YOUR_TARGET_FRAME;
                 }completion:^(BOOL finished) {

                 }];


Answer 6:

如果您viewcontrollers viewWillLayoutSubviews(或)设置yourView的“初始”框,然后,显然被动画周期中调用,因此将重新由动画设定的框架。



Answer 7:

斯威夫特4

  UIView.animate(withDuration: 0.3, animations: {
        self.whiteBackgroundView.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
        self.view.layoutIfNeeded()
    }) { (finished) in
        // end of animation
    }


文章来源: How to animate the width and height of a UIView in Xcode?