【问题标题】:subView not animating properly when main View shrinks主视图缩小时子视图无法正确动画
【发布时间】:2014-01-17 14:52:24
【问题描述】:

我的应用有一个名为 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 增长时标签应该完美地动画,但当它缩小时根本无法动画。我在文档中没有看到任何表明会有差异的内容。感谢您提供任何帮助。

【问题讨论】:

    标签: ios uiview core-animation subview autoresizingmask


    【解决方案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得到了回答——提供的答案似乎与我上面的建议一致。

    【讨论】:

    • 刚试过这个,以及你链接的解决方案(我没想到特别要寻找 UILabel,对此感到抱歉!)。两者都不起作用:标签只是保持其原始大小而不是增长。据我了解,诀窍是手动更改容器视图的框架以及 stepView 的框架,而不依赖于 autoResizing? (我不认为我已经完全探索了这个解决方案,但当然在答应我几个小时进行测试之后,我被告知要扑灭一些火灾,但我会尽快解决!)
    • 顺便提一下,我还尝试让标签与 stepView 的最大宽度一样宽,并确保 stepView.clipstoBounds = YES。奇怪的是,标签最初显示正确,并且正常增长,但是当 stepView 缩小标签的全宽变得可见时,即使 stepView 的 clipsToBounds 仍然是 YES,也超出了 stepView 的框架。这个周末我会尝试更多地戳这个......
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多