我有这样子视图我想要添加到我的主要观点,但使它从原点展开。 我看了一些苹果的文档,但我不明白的地方,我会犯错。 我可以动画坐标系的原点,即得到它随时随地在下滑,但宽度/高度似乎没有动画。 代码如下:
[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) {
}];
这仍然没有出于某种原因。 我看到可能的问题是:
- 我从一个加载此customView
nib
特异性310是150,也许这是造成问题。 - 我不输入正确的框架,但因为我可以动画这个观点的frame.origin部分,我不知道是这样的话......我有
QuartzCore
和Core 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?