我的应用程序有一个名为stepView的UIView,它需要增长和缩小,总是向下扩展到右边,并且总是在向左和向左缩小。它有一个子视图durationLabel,它沿着stepView的整个宽度运行,并具有固定的高度。
当stepView动画变大时,标签会随之增长:文本和标签的背景向右滑动,与增长的stepView同步。但是,当stepView动画变得更小时,它会立即捕捉到新的大小,在stepView缩小的右边缘和右边缘之间留下间隙,直到动画完成。
stepView.m中的标签初始化代码:
CGRect duration_frame = CGRectMake(0, 0, self.frame.size.width, HEADER_HEIGHT);
self.durationLabel = [[UILabel alloc] initWithFrame:duration_frame];
[self.durationLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[self addSubview:self.durationLabel];
动画代码:
[UIView animateWithDuration:ANIM_DURATION
animations:^{
[stepView setFrame:newFrame];
}
];
使用bounds / center而不是frame会产生相同的效果。我考虑过使用转换,但是计算“newFrame”的代码有点涉及,所以我宁愿避免在可能的情况下重写它。我也尝试在同一个动画块中手动更改标签的框架,但这只是让它完全消失(可能是因为我试图在同一个动画块中为视图的框架及其子视图的框架设置动画?)。我还确认了stepView及其子视图同时没有经历任何其他动画,尽管在单独的动画块中有不相关视图的动画。
我不知道为什么标签在stepView增长时应该完美地动画,但在缩小时根本无法动画。我没有在文档中看到任何表明存在差异的内容。感谢您提供任何帮助。
答案 0 :(得分:1)
我认为这是UILabel的一个问题 - 使用另一个UIView作为子视图而不是UILabel,动画也可以在缩小时正常工作。
如果我正确理解您需要获得的结果,我建议您尝试以下方法:
不要设置autoresizingMask属性
// [self.durationLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
将stepView clipToBounds属性设置为YES
self.clipToBounds = YES;
这样UILabel框架不会改变,但只有实际位于stepView边界内的部分才会可见。我希望这可能有所帮助。
更新:刚做了一个快速研究,发现这个问题已在这里得到解答resize uiview with UILabel and animate it correctly - 所提供的答案似乎与我上面建议的一致。