Ios 从下到上设置UIView高度的动画
我正在做一个简单的UIView高度动画,以便显示 默认情况下,它似乎从上到下显示,我希望它从下到上显示 我将UIView定位到屏幕底部 我肯定我错过了一些简单的东西。。。。。有什么建议吗Ios 从下到上设置UIView高度的动画,ios,animation,uiview,Ios,Animation,Uiview,我正在做一个简单的UIView高度动画,以便显示 默认情况下,它似乎从上到下显示,我希望它从下到上显示 我将UIView定位到屏幕底部 我肯定我错过了一些简单的东西。。。。。有什么建议吗 谢谢相反,您可以尝试使用clipsToBounds=YES将其放置在视图中,然后从视图的底部到中间设置动画,如下所示: viewToAnimate.frame = CGRectMake(viewToAnimate.frame.origin.x,
谢谢相反,您可以尝试使用
clipsToBounds=YES
将其放置在视图中,然后从视图的底部到中间设置动画,如下所示:
viewToAnimate.frame = CGRectMake(viewToAnimate.frame.origin.x,
viewToAnimate.superview.frame.size.height,
viewToAnimate.frame.size.width,
viewToAnimate.frame.size.height);
[UIView animateWithDuration:0.5 animations:^{
viewToAnimate.center = viewToAnimate.superview.center;
}];
这样,您就不必将高度设置为0,它解决了视图中自动调整大小的任何问题。就像一只带骨头的狗,我发现了这一点 我没有设置帧高度的动画,而是对视图应用了变换并设置了层的定位点
//set the anchor point to the bottom of the view
[self setAnchorPoint:CGPointMake(0.5, 1.0) forView:hostView];
//Scale the height to close to zero
hostView.transform = CGAffineTransformMakeScale(1, 0.00001);
如果我将0作为y比例,视图的行为会很奇怪。。。。在动画结束时,我只是将其设置为隐藏
在备份的过程中,我只使用标识转换(重置它)
请注意,更改锚定点会改变视图的位置。有关设置锚点后使视图正常化的setAnchorPoint方法,请参见本文
根据要求,这是我正在使用的代码。。。我用的是一个CAKeyFrameAnimation,可能比你要找的要多一些。对于CABasicAnimation,它可能也能起到同样的作用,我只是向您展示这段代码,因为我已经编写了它
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
springLayer = [[CALayer alloc] init];
springLayer.backgroundColor = [UIColor redColor].CGColor;
springLayer.anchorPoint = CGPointMake(0, 1);
springLayer.frame = CGRectMake(125, 285, 100, 115);
[springLayer setNeedsDisplay];
[self.layer addSublayer:springLayer];
[self test];
}
return self;
}
-(void)test {
CAKeyframeAnimation *heightAnim = [[CAKeyframeAnimation alloc] init];
heightAnim.duration = 3;
heightAnim.removedOnCompletion = NO;
heightAnim.fillMode = kCAFillModeForwards;
heightAnim.beginTime = CACurrentMediaTime() + 0.25;
NSMutableArray *v = [[NSMutableArray alloc] init];
NSMutableArray *t = [[NSMutableArray alloc] init];
float dest = 250;
float difference = 135;
while (difference > 1.0) {
[v addObject:[NSNumber numberWithFloat:dest-difference]];
[t addObject:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
difference *= 0.7;
[v addObject:[NSNumber numberWithFloat:dest+difference]];
[t addObject:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
difference *= 0.7;
}
heightAnim.values = v;
heightAnim.timingFunctions = t;
[springLayer addAnimation:heightAnim forKey:@"bounds.size.height"];
}
我真的认为实现这一点最简单的方法是为视图的高度和y属性设置动画。如果它们发生在同一条曲线上,对用户来说应该是完全无缝的。在将高度设置为0的动画时,还要将y组件设置为原始y+原始高度的动画
UIView *view = ...;
float originalY = view.frame.origin.y;
float originalH = view.bounds.size.height;
[UIView animateWithDuration:1.2f delay:1.0f options:UIViewAnimationCurveEaseInOut animations:^{
view.frame = CGRectMake(view.frame.origin.x, (originalY + originalH), view.bounds.size.width, 0);
}completion:^(BOOL finished) {
NSLog(@"Animation is complete");
}];
我相信这会给人一种崩溃的感觉。我没有在代码中尝试过这一点,但我看不出有什么理由不可能做到这一点。我使用AdWhirlView实现这一点的一种方法是,将其隐藏在屏幕下方,然后设置动画
AdWhirlView *adWhirlView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
adWhirlView.delegate = self;
adWhirlView.frame = CGRectMake(0, 430+kAdWhirlViewHeight, kAdWhirlViewWidth, kAdWhirlViewHeight);
[self.parentViewController.view insertSubview:adWhirlView belowSubview:self.view];
[UIView beginAnimations:@"AdWhirlIn" context:nil];
[UIView setAnimationDuration:.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
adWhirlView.frame = CGRectMake(0, 430, kAdWhirlViewWidth, kAdWhirlViewHeight);
[UIView commitAnimations];
藏在下面
[self animateViewHeight:myView withAnimationType:kCATransitionFromBottom];
用于反向动画
[self animateViewHeight:myView withAnimationType:kCATransitionFromTop];
你有没有试着把它锚定在底部,然后把y坐标改变到你视图中正确的位置?是的,它锚定在底部。我想也许我需要翻转坐标系或者类似的东西。。。。因为在动画块中,我告诉帧从100到0,iOS坐标从上到下…更改y坐标只会将视图移出屏幕。。。我想让它崩溃,因为它不起作用。不管怎么说,它都在iPad上。想象一下,在屏幕中间,我想崩溃的正方形视图。我没有屏幕边缘的奢华。我想从上到下折叠长方体,然后从下到上再次显示它…我只需设置锚定在(0,1)处的CALayer高度的动画,并在锚定在底部时向顶部设置动画。我还没有尝试过UIView。听起来这很有效-但有点像黑客,我是一个纯粹主义者。。。必须有一个正确的方法来做这件事,现在它困扰着我,我必须找出它。。。谢谢你的想法,但我不认为这是一种黑客行为。此外,从你所描述的,它看起来像是从底部向上滑动,而不是增长,对吗?此外,我不认为有一种非黑客的方式可以从底部“生长”它,因为原点发生了变化。y将从顶部开始动画。我认为这是一种黑客行为,因为我相信有一种“正确”的方式来做。。。。我会在我的继承权中添加多余的UIView,以屏蔽其他视图的移动,从而执行我需要的操作。我应该能够将变换直接应用到我想要设置动画的图层上。ThanQ它通过一些自己的修改对我有很大帮助,不管怎样,这对于开始来说太多了……对不起,但是实际的“高度”值在哪里变化?回答得很好!在我找到您的ans之前,我尝试使用transitionWithView(…)方法,但实际上,正如我所看到的,它在选项参数中没有任何正常的转换。答案很好。但对我来说,KCATransionFrombottom是自上而下的。为什么会这样?
[self animateViewHeight:myView withAnimationType:kCATransitionFromTop];
- (void)animateViewHeight:(UIView*)animateView withAnimationType:(NSString*)animType {
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionPush];
[animation setSubtype:animType];
[animation setDuration:0.5];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[animateView layer] addAnimation:animation forKey:kCATransition];
animateView.hidden = !animateView.hidden;
}