如何使用UIView的自动调整大小属性进行编程?

67
我已经使用Interface Builder布置了一些子视图,但我想改用代码实现。
我阅读了有关设置view.autoresizingMask属性的UIView文档。我正在寻找如何通过使用提供的各种掩码(例如UIViewAutoresizingFlexibleLeftMargin等)来翻译strutssprings的逻辑解释。
2个回答

143

当设置视图的自动调整大小掩码时,使用按位包含 OR (|) (Objective-C),或使用数组 (Swift 2, 3, 4) 来指定弹簧支撑

  • 弹簧通过指定掩码来表示(分别在Objective-C或Swift中):

    • 垂直弹簧: UIViewAutoresizingFlexibleHeight.flexibleHeight

    • 水平弹簧: UIViewAutoresizingFlexibleWidth.flexibleWidth

  • 支撑通过缺少四个“ 弹性边距 ”掩码中的一个来表示(即如果不存在支撑,则会指定该边距的掩码):

    • UIViewAutoresizingFlexibleLeftMargin.flexibleLeftMargin

    • UIViewAutoresizingFlexibleRightMargin.flexibleRightMargin

    • UIViewAutoresizingFlexibleTopMargin.flexibleTopMargin

    • UIViewAutoresizingFlexibleBottomMargin.flexibleBottomMargin

例如,具有水平弹簧顶部和底部支撑的视图将具有指定为可伸缩的宽度、左右边距:

Swift 3和4

mySubview.autoresizingMask = [.flexibleWidth, .flexibleLeftMargin, .flexibleRightMargin]

Swift 2

mySubview.autoresizingMask = [.FlexibleWidth, .FlexibleLeftMargin, .FlexibleRightMargin]

Swift 1.2

mySubview.autoresizingMask = .FlexibleWidth | .FlexibleLeftMargin | .FlexibleRightMargin

Objective-C

mySubview.autoresizingMask = (UIViewAutoresizingFlexibleWidth |    
                              UIViewAutoresizingFlexibleLeftMargin |  
                              UIViewAutoresizingFlexibleRightMargin);

在此输入图片描述


4
@Flink - 你的编辑是错误的。我已经将我的答案恢复到原始状态。请仔细阅读它,特别是这一部分:“支撑元素是由四个‘可伸缩边距’掩码中缺少其中一个所代表的(也就是说,如果不存在支撑元素,则指定该边距的掩码):” - MattyG

10

UIViewAutoResizingMask被称为“支撑”和“拉伸”。考虑这样一个情况:你有一个大正方形,里面有一个小正方形。为了让小正方形保持完美的居中,你必须设置大正方形每个内侧边缘的固定宽度来限制它。这些就是“支撑”。

而“拉伸”则更像UIView在旋转过程中的行为。假设我们的视图必须保持在屏幕底部,与屏幕中央对齐(就像UIToolbar一样)。我们想要将其顶部弹簧设置为灵活的,这样当视图从460像素旋转到320像素时,它仍然相对于屏幕保持相同的位置。在IB中突出显示其中一个弹簧,等同于设置适当的UIViewAutoResizingMask,特别是突出显示顶部弹簧就类似于调用myView.autoResizingMask = UIViewAutoresizingFlexibleTopMargin

这些值可以同时使用,在括号中使用或运算符,例如:myView.autoResizingMask = (UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin)

这些掩码向你报告数字,因为它们是NSUInteger的typedef,并且这些标记是由苹果分配的。在其中一个上使用Cmd+单击可查看其方法定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接