UIView调整动画故障

时间:2011-07-08 02:10:44

标签: iphone objective-c ios uiview

我一直在努力应对看似微不足道的小故障,就像我的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

你可以看到当你点击“成长”按钮时,视图的左侧在制作动画之前会出现“毛刺”。虽然在这里清晰可见,但在我的真实项目中却有点糟糕。

我不确定这是我的代码中的错误还是框架的问题?希望它是前者......

谢谢, 亚伦。

更新 收到雅各布的慷慨反馈之后,我回到了我的应用程序并将contentMode设置删除为UIViewContentModeRedraw,注意到他每次动画时都会运行drawRect,也许初始帧是故障的一部分。所以现在动画很流畅,但它动画到错误的位置,压扁了两侧。我已经将链接项目更新为更准确地反映我的应用程序中发生的事情。

如果我不得不猜测,似乎contentStretch属性没有完成它的工作。根据我的指示,它正在调整整个事物而不是CGRect区域。任何人都可以确认我是否正确使用它?

2 个答案:

答案 0 :(得分:2)

我现在已经弄明白了;这是解决这个问题的其他人的答案。

UIView的contentStretch属性的文档并没有说明完整的故事。就我而言,我理解contentStretch的目的是描述一个应该改变大小的区域的“样本”。相反,contentStretch需要描述将要调整大小的整个区域。在我写这篇文章的时候,这更有意义,但之前对我来说并不明显。

因此,我的原始声明:

self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f);

描述了没有宽度或高度的矩形!所以它实际上什么也没做。相反,我使用的是一个包含大部分视图边界的矩形,除了用于结束,我不想因尺寸变化而扭曲:

self.contentStretch = CGRectMake(0.2, 0, 0.7, 1);

请注意,它是一个矩形,在x轴上开始20%,并且在全高时跨越70%的宽度。在我的矩形需要的尺寸中,这很好地覆盖了它。

感谢Jacob建议删除contentMode属性;在这种情况下完全没有必要。

干杯, 亚伦。

答案 1 :(得分:1)

删除TitleView.m中的以下行:

self.contentMode = UIViewContentModeRedraw;

您不想使用UIViewContentModeRedraw的原因是因为它在边界更改时重新显示视图的内容。因此,动画中的锯齿状第一帧。

默认contentModeUIViewContentModeScaleToFill,这就是您想要的。