我一直在努力与一个看似小故障在我的UIView子类动画的方式。我把视图设置成这样:
self.contentMode = UIViewContentModeRedraw;
self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f);
视图基本上是一个矩形,有一个3像素的描边。因为我希望视图在调整大小时不会扭曲,所以我使用contentStretch属性指示视图的中间位置。问题是,它在生长的时候会变形,但在收缩的时候是平滑的。
似乎我的动画块是相当直接的;我有不同的成长和萎缩。下面是正在增长的代码块:
[UIView animateWithDuration:0.5 animations:^{
CGRect newRect = CGRectMake(20, 100, 200, 70);
[titleView setFrame:newRect];
}];
这很难在一篇文章中描述,所以我组装了一个测试用例项目,只隔离与此相关的部分。有人想看一下吗?
http://dl.dropbox.com/u/2798577/ViewResizeTest2.0.zip你可以看到,当你点击"增长"按钮时,视图的左侧在动画之前会出现"故障"。虽然在这里可以清楚地看到,但在我的实际项目中情况更糟。
我不确定这是一个bug在我的代码或问题与框架?希望是前者……
谢谢,亚伦。
收到Jacob的慷慨反馈后,我回到了我的应用程序,并删除了contentMode设置为UIViewContentModeRedraw,注意到他会在每次动画时运行drawRect,也许初始帧是故障的一部分。所以现在动画是平滑的,但是它动画到错误的位置,压扁了两边。我已经更新了链接项目,以更准确地反映我的应用程序中发生的事情。
如果我不得不猜测,似乎contentStretch属性没有做它的工作。它调整了整个东西的大小,而不是按照我的指令在里面调整一个crect区域。有人能确认我用对了吗?
我现在明白了;下面是给遇到这个问题的人的答案。
UIView的contentStretch属性的文档并没有讲述完整的故事。在我的例子中,我理解contentStretch的目的是描述一个应该改变大小的区域的"样本"。相反,contentStretch需要描述要调整大小的整个区域。当我写这篇文章时,这一点现在更有意义了,但以前我并不明显。
因此,我最初的声明:self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f);
描述了一个没有宽度和高度的矩形!所以它实际上什么也没做。相反,我使用的是一个rect,它包含了视图的大部分边界,除了的结尾,我不希望被大小变化扭曲:
self.contentStretch = CGRectMake(0.2, 0, 0.7, 1);
请注意,它是一个矩形,从x轴的20%开始,在全高时跨度为宽度的70%。在我的矩形需要的尺寸中,它完美地覆盖了它。
感谢Jacob移除contentMode属性的建议;在这种情况下,那是完全没有必要的。
欢呼,亚伦。
去掉TitleView.m
中的以下行:
self.contentMode = UIViewContentModeRedraw;
你不想使用UIViewContentModeRedraw
的原因是因为当它的边界改变时,它会重新显示视图的内容。因此,动画中的第一帧是锯齿状的。
默认的contentMode
是UIViewContentModeScaleToFill
,这是您想要的