2010-01-20 106 views
0

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

我取得了一些成功使用:

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

有容器自动调整其子视图时,其框架的变化。

不幸的是,当子视图的内容发生变化导致它扩大或缩小时,我遇到了很多麻烦。简单地设置'setNeedsLayout'并为子视图定义'layoutSubviews'似乎并没有做到这一点,因为在'layoutSubviews'开始时,子视图的框架没有被调整。如果我强迫它,那么当前的内容被拉伸或收缩,这看起来很可怕。

如果有人能解释如何在这种情况下使用sizeToFit,layoutSubviews,sizeThatFits:,setAutoresizesSubviews:,setAutoresizingMask :,和setContentMode:我肯定会很感激。我的意思是,如果我想调整一个子视图的内容(并扩大它),然后我怎么做这样的:

  • 子视图加宽(无不利拉伸或在其内部还有自动调整的任何东西)
  • 容器变宽成比例的量
  • 没有其他子视图的受影响

在此先感谢!

回答

1

我结束了去手动路线,使用sizeThatFits:和layoutSubviews明确控制如何重绘和组织。我发现setAutoresizesSubviews:和setAutoresizingMask:对简单的布局有所帮助,但是如果我尝试了任何事情,即使有点不典型,也很难调试。

我的建议:首次尝试编程式布局时,为所有(子)视图定义sizeThatFits并为每个视图定义layoutSubviews。使用调试语句记录所有内容的位置。一旦你快乐,考虑将自动调整大小简单地代码(如果可能的话)。

0

对于动画视图的调整大小做:

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

如果你不想元素自动调整,只设置了自动调整大小以UIViewAutoresizingNone

如果我正确地得到您的案例,您不希望包含器及其子视图自动调整大小,除了您提到的子视图。该视图应该启用一些自动调整选项(我不完全知道你想要的,只是尝试一些,看看它们的效果)。该子视图的子视图也应该禁用。