2011-07-08 137 views
2

我一直在努力与我的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

我已经明白了这一点;这是遇到这个问题的其他人的答案。

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

因此,我原来的声明:

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

描述一个矩形是没有宽度或高度!所以它实际上什么都没做。取而代之的是,我使用的是矩形,包括大多数观点的界限,除了的目的,这是我不希望由大小变化扭曲:

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

注意,那就是开始20%的矩形进入x轴,并在全高度跨越70%的宽度。在我的主持人需要的尺寸中,这个很好地覆盖了它。

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

干杯, 亚伦。

1

得到TitleView.m去掉下面一行:

self.contentMode = UIViewContentModeRedraw; 

为什么你不希望使用UIViewContentModeRedraw是因为它重新显示视图的内容时,它的范围变化的原因。因此动画中锯齿状的第一帧。

默认contentModeUIViewContentModeScaleToFill,这正是你想要的。

+0

谢谢你的雅各布。我认为你已经解决了部分问题。但是,似乎在我的示例应用程序中显示出一个弱点。我已经更新了该应用程序,并且在我的问题中添加了关于此的注释。 –