繁体   English   中英

当主视图缩小时,子视图无法正确设置动画

[英]subView not animating properly when main View shrinks

我的应用程序具有一个称为stepView的UIView,该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]; 
     }
];

使用边界/中心而不是框架会产生相同的效果。 我曾经考虑过使用转换,但是计算“ newFrame”的代码有些复杂,因此我宁愿避免重写它(如果可能)。 我也尝试过在同一动画块中手动更改标签的帧,但这只是使其完全消失(可能是因为我试图为同一动画块中的视图帧及其子视图的帧设置动画?)。 我还确认了stepView及其子视图不会同时进行其他任何动画处理,尽管在单独的动画块中不相关的视图中发生了动画处理。

我不知道为什么在stepView增长时标签应该完美地动画,而在收缩时却完全不能动画。 我没有在文档中看到任何表明会有差异的内容。 感谢您提供任何帮助。

我认为这是UILabel的问题-使用另一个UIView作为子视图而不是UILabel时,动画在收缩时也可以正常工作。

但是,如果我正确理解您需要获得的结果,建议您尝试以下操作:

  • 不要设置autoresizingMask属性

     // [self.durationLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
  • 将stepView clipToBounds属性设置为YES

     self.clipToBounds = YES; 

这样,UILabel框架将不会更改,而只有在stepView边界内的部分才可见。 我希望这会有所帮助。

更新:进行了快速研究,发现问题已经在这里得到解答,并使用UILabel调整uiview的大小并正确设置动画效果 -提供的答案似乎与我上面建议的一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM