向/从UIView添加/删除子视图时的平滑缩放

时间:2010-01-20 04:20:45

标签: iphone uikit uiview

我正在使用UIView的子类(以编程方式)包含和管理许多子视图(主要是UIImageViews),这些子视图彼此相邻,使得没有任何重叠。可以安全地假设子视图具有相同的高度(最初绘制时),但宽度不同。容器可能会调整大小,在这种情况下,我希望按比例缩放子视图。此外,有时我需要添加/删除/编辑任何给定的子视图(可能会改变其宽度)。

我在使用方面取得了一些成功:

[self setAutoresizesSubviews:YES];
[self setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin  |
                               UIViewAutoresizingFlexibleWidth       |
                               UIViewAutoresizingFlexibleRightMargin |
                               UIViewAutoresizingFlexibleTopMargin   |
                               UIViewAutoresizingFlexibleHeight      |
                               UIViewAutoresizingFlexibleBottomMargin)];

让容器在其框架更改时自动调整其子视图的大小。

不幸的是,当子视图的内容发生变化,导致它变宽或收缩时,我遇到了很多麻烦。简单地设置'setNeedsLayout'并为子视图定义'layoutSubviews'似乎没有办法,因为在'layoutSubviews'的开头,子视图的框架尚未调整。如果我强迫它,那么当前的内容会被拉伸或收缩,这看起来很糟糕。

如果有人能解释一下sizeToFit,layoutSubviews,sizeThatFits:,setAutoresizesSubviews:,setAutoresizingMask:和setContentMode:应该在这种情况下使用,我当然感激不尽。我的意思是,如果我想调整子视图的内容(并加宽它),那么我该怎么做呢:

  • 子视图被加宽(不会对其中的任何其他内容产生负面拉伸或自动调整)
  • 容器按比例加宽
  • 其他子视图均未受影响

提前致谢!

2 个答案:

答案 0 :(得分:1)

我最终选择了手动路线,使用sizeThatFits:和layoutSubviews来显式控制重绘和组织所有内容的方式。我发现setAutoresizesSubviews:和setAutoresizingMask:帮助进行简单的布局,但是如果我尝试了一些甚至是非常典型的东西,那就很难调试。

我的建议:您第一次尝试编程布局时,为所有(子)视图定义sizeThatFits,并为每个视图定义layoutSubviews。使用调试语句记录所有内容的位置。一旦您满意,请考虑将自动调整功能简化为代码(如果可能)。

答案 1 :(得分:0)

为了调整视图大小的动画,请执行以下操作:

[UIView beginAnimations:@"resizeAnimation" context:nil];
youView.frame = newFrame;
[UIView commitAnimations];

如果您不希望元素自动调整大小,只需将其自动调整大小设置为UIViewAutoresizingNone

如果我的案例正确无误,除了您提到的子视图外,您不希望封面及其子视图自动调整大小。该视图应该启用一些自动调整选项(我不知道你想要的那些,只是尝试一些并看到它们的效果)。该子视图还应该禁用其子视图大小调整。