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

你可以看到,当你点击"增长"按钮时,视图的左侧在动画之前会出现"故障"。虽然在这里可以清楚地看到,但在我的实际项目中情况更糟。

我不确定这是一个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的原因是因为当它的边界改变时,它会重新显示视图的内容。因此,动画中的第一帧是锯齿状的。

默认的contentModeUIViewContentModeScaleToFill,这是您想要的

最新更新