Iphone 如何在调整UIView大小时设置动画

Iphone 如何在调整UIView大小时设置动画,iphone,cocoa-touch,uiview,ios4,core-animation,Iphone,Cocoa Touch,Uiview,Ios4,Core Animation,我在网上看到了一些资料,但还是不能达到我想要的目的。 我需要设置向下视图的动画,使其高度更大 这是到目前为止我的代码。这里发生的事情,不是我的视图调整大小,而是它只是把它的位置调高了一点。 如果我将property而不是“bounds.size”改为“transform.scale.y”,效果会好一点,只是这次它可以上下扩展视图,而不仅仅是向下扩展 还有一件事我不熟悉:这些键只是CALayer属性吗?在哪里可以找到这些钥匙的列表 我真的很感激你的帮助。谢谢 int x = self.btnHea

我在网上看到了一些资料,但还是不能达到我想要的目的。 我需要设置向下视图的动画,使其高度更大

这是到目前为止我的代码。这里发生的事情,不是我的视图调整大小,而是它只是把它的位置调高了一点。 如果我将property而不是“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];

不能只更改UIView动画块中的帧。在这种情况下,似乎不需要CABASICANIATION

[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]; [UIView beginAnimations:@“调整动画大小”上下文:NULL]; //设置你的持续时间。较长的持续时间最好是调试 //0.1对于理解出了什么问题来说真的很短 [UIView设置动画持续时间:2]; btnHead.frame=新帧; [UIView委员会];
设置
属性的动画可能会有问题,但只要
变换
是标识(也就是说,您没有更改它),该属性就可以正常工作。我刚刚测试了以下代码,它按预期工作:

[UIView animateWithDuration:.1f animations:^{
  CGRect theFrame = myView.frame;
  theFrame.size.height += 50.f;
  myView.frame = theFrame;
}];
同样,如果您在任何时候更改了
transform
属性,这将无法按预期工作。对于此动画的更防弹版本,您需要像尝试使用核心动画一样设置
边界
属性的动画。不过,您仍然不需要进入核心动画

这里需要了解的重要内容是
边界
中心
属性之间的关系。所有仿射变换(平移、缩放或旋转)都需要一个参照点来执行变换。如果是
ui视图
,则为
中心
CALayer
允许您通过
anchorPoint
属性移动参考点,但在这种情况下,我们不需要担心这一点

视图在两个方向上缩放的原因是缩放操作发生在
中心附近。然后,最简单的方法是将
中心
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;
}];
最后要考虑的是,当
边界改变时,强制视图重新绘制。出于性能原因,当您更改其
边界时,视图将不会重新绘制。但是,当您更改
frame
属性时,它会重新绘制(这是
frame
属性的另一个怪癖)。要强制对
bounds
change重新绘制,您需要像我在上一个代码段的第一行中那样设置
contentMode
。您可能希望在动画完成后将其设置回原处,但这取决于您。这也是核心动画版本仅更改位置而不更改大小的原因。在运行动画之前,您需要在代码中的某个位置使用以下行:

self.btnHead.layer.needsDisplayOnBoundsChange = YES;
我希望这一切都有意义。
frame
bounds
center
属性一开始可能有点混乱

btnHead.clipsToBounds=YES
解决了这个问题。
不清楚具体原因。

剪贴簿是解决方案

说明: clipToBounds是一个属性,用于指定是否应裁剪子视图。因此,如果子视图大于其superview,则如果您设置了
“superview.cliptobunds=YES”
,它将被裁剪。在本篇文章中,superview的大小已调整,但用户看不到明显的差异,因为即使子视图位于框架之外,也会绘制子视图


这有点棘手,因为没有与动画的可见链接,但这就是为什么此属性会有所不同。

你不喜欢简单吗?不!试过第一件事。它不起作用。它会更改帧大小,但不会设置动画。使用有效的NSString作为beginAnimations的第一个参数,而不是使用nil。请告诉我们这是否解决了问题。其他事情看起来不错。不,没用。顺便说一句,如果我改变了alpha,它会产生动画效果。你可以自己试一试,看看有没有用。此外,我不明白为什么像我发布的第一个代码片段中那样更改“bound.size”只会将视图向上移动而不会向下延伸。不幸的是,我现在没有Mac电脑。所以不能运行代码。由于alpha更改正在设置动画,因此帧中一定有一些小错误。帧是一个可设置动画的属性,它也应该像alpha一样设置动画。让我们看看其他成员是否能发现这个bug。首先,感谢您提供了一个非常好的答案。对于点,为什么在更改帧时不需要更改中心点,而在更改边界时需要更改中心点?不管怎样,在我把btnHead.clipsToBounds=YES….放进去之后,它开始动画化了。。。。不确定原因。
frame
是一个方便的属性(用于更轻松地布局视图),用于描述视图在其父坐标空间中的矩形。帧
值从不存储。它是根据
边界
中心
计算的。因此,当您更改
时,实际上是在更改
边界
中心
bounds
描述视图在其自身坐标空间中的边界矩形(这就是其原点通常为{0,0})的原因,
center
描述视图在其父坐标空间中的位置。所以,这两个代码示例实际上做了完全相同的事情。嗨,这是否意味着当我想更改它在屏幕上的位置(它是(x,y)),我通常不应该触摸bounds.origin,而只应该触摸bounds.size和center?我想换相框要容易得多。