我在网上看到了一些材料,但仍然无法到达我想要的地方。 我需要向下移动我的视图,使其高度更大。
到目前为止,这是我的代码。这里发生的事情是,不是我的视图调整大小,它只是改变了它的位置。 如果我将proprty而不是“bounds.size”更改为“transform.scale.y”,它会更好一些,只是这次它会向上和向下扩展视图,而不仅仅是向下扩展。
我不喜欢的另一件事是:这些键只是CALayer属性吗?在哪里可以找到这些键的列表?
我真的很感激这里的帮助。谢谢!
int x = self.btnHead.frame.origin.x;
int y = self.btnHead.frame.origin.y;
int height = self.btnHead.frame.size.height;
int width = self.btnHead.frame.size.width;
CABasicAnimation *resizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
[resizeAnimation setToValue:[NSValue valueWithCGSize:CGSizeMake(width,height+50)]];
resizeAnimation.fillMode = kCAFillModeForwards;
resizeAnimation.removedOnCompletion = NO;
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.animations = [NSArray arrayWithObjects:resizeAnimation,nil];
animationGroup.removedOnCompletion = NO;
animationGroup.fillMode = kCAFillModeForwards;
animationGroup.removedOnCompletion=NO;
animationGroup.duration = 0.1;
[self.btnHead.layer addAnimation:animationGroup forKey:@"animations"];
编辑:按要求发布我的第一个代码 - 这只会更改我的视图大小,但无论我输入的持续时间都不会设置动画。
int x = self.btnHead.frame.origin.x;
int y = self.btnHead.frame.origin.y;
int height = self.btnHead.frame.size.height;
int width = self.btnHead.frame.size.width;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:10];
CGRect rect = CGRectMake(x,y,width ,height+BUTTON_HEIGH*2);
self.btnHead.frame = rect;
[UIView commitAnimations];
答案 0 :(得分:53)
设置frame
属性的动画可能会有问题,但只要transform
是标识(即您没有更改它),它就可以正常工作。我刚刚测试了以下代码,它按预期工作:
[UIView animateWithDuration:.1f animations:^{
CGRect theFrame = myView.frame;
theFrame.size.height += 50.f;
myView.frame = theFrame;
}];
同样,如果您在任何时候更改了transform
属性,这将无法按预期工作。对于此动画的更加防弹版本,您需要像尝试使用Core Animation一样为bounds
属性设置动画。不过,你仍然不需要进入Core Animation。
这里要理解的重要一点是bounds
和center
属性之间的关系。所有仿射变换(平移,缩放或旋转)都需要一个参考点来执行变换。如果UIView
是center
点。 CALayer
允许您通过anchorPoint
属性移动参考点,但在这种情况下我们不需要担心。
视图在两个方向上缩放的原因是缩放操作发生在center
附近。最简单的方法是将center
y 移动高度增量的一半。像这样:
myView.contentMode = UIViewContentModeRedraw;
[UIView animateWithDuration:.4f animations:^{
CGRect theBounds = myView.bounds;
CGPoint theCenter = myView.center;
theBounds.size.height += 50.f;
theCenter.y += 25.f;
myView.bounds = theBounds;
myView.center = theCenter;
}];
最后一个考虑是强制视图在bounds
更改时重绘。出于性能原因,更改其bounds
时,视图不会重绘。但是,当您更改frame
属性(又是frame
属性的另一个怪癖)时,它会重新绘制。要在bounds
更改时强制重绘,您需要设置contentMode
,就像我在上一个代码段的第一行中所做的那样。您可能希望在动画结束后将其设置回来,但这取决于您。这也是您的Core Animation版本仅更改位置而不是大小的原因。在运行动画之前,您需要在代码中使用此行:
self.btnHead.layer.needsDisplayOnBoundsChange = YES;
我希望这一切都有道理。 frame
,bounds
和center
属性最初可能会有些混乱。
答案 1 :(得分:10)
答案 2 :(得分:9)
你不能只改变UIView动画块中的帧。看起来在这种情况下不需要CABasicAnimation。
[UIView beginAnimations:@"resize_animation" context:NULL]; // set your duration. a long duration is better to debug // 0.1 is really short to understand what is going wrong [UIView setAnimationDuration:2]; btnHead.frame = newFrame; [UIView commitAnimations];
答案 3 :(得分:2)
clipsToBounds是解决方案。
说明:
clipToBounds是一个属性,指定是否应裁剪子视图。因此,如果子视图大于其超级视图,则在设置"superview.clipToBounds=YES"
时将裁剪它。在这篇文章的情况下,超级视图WAS已调整大小,但用户没有明显的差异,因为即使它们在框架外,也会绘制子视图。
这有点棘手,因为动画没有可见的链接,但这就是为什么这个属性有所不同。