现在的位置: 首页 > 综合 > 正文

UIView详解3

2013年12月10日 ⁄ 综合 ⁄ 共 1927字 ⁄ 字号 评论关闭

第四、调整大小的相关属性或函数(Configuring the Resizing Behavior)

1. autoresizingMask  property

 概属性用来指出当父窗口发生变化时,子窗口应该如何变

  如果视图的autoresizesSubviews属性声明被设置为YES,则其子视图会根据autoresizingMask属性的值自动进行尺寸调整。简单配置一下视图的自动尺寸调整掩码常常就能使应用程序得到合适的行为;否则,应用程序就必须通过重载layoutSubviews方法来提供自己的实现。

2. autoresizesSubviews  property
返回值为true或false,表示当父窗口发生变化时,子窗口是否应该变化

3.  contentMode  property

主要用在UIImageView,当窗口大小和图片大小不一样时,通过该字段选择合适的布局方式。

4. – sizeThatFits:

Asks the view to calculate and return the size that best fits its subviews.

- (CGSize)sizeThatFits:(CGSize)size
Parameters
size

The current size of the receiver.

Return Value

A new size that fits the receiver’s subviews.

5. – sizeToFit

Resizes and moves the receiver view so it just encloses its subviews.

- (void)sizeToFit得到最适合当前字数的尺寸,
    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 70, 20)];
    label.backgroundColor = [UIColor blueColor];
    label.text = @"fdsafasfsaaaaaaaaaaaaaa";
    [self.view addSubview:label];
    NSLog(@"bounds %@",NSStringFromCGRect(label.frame));
    [label sizeToFit];
    NSLog(@"bounds is %@",NSStringFromCGRect(label.frame));

返回结果是:

2013-09-02 18:39:16.284 single[1494:c07] bounds {{0, 0}, {70, 20}}

2013-09-02 18:39:16.285 single[1494:c07] bounds is {{0, 0}, {201, 21}}

第五、Laying out Subviews

1. – layoutSubviews

这个方法是当你需要在调整subview的大小的时候需要重写(我这个翻译不严谨,以下是原文:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.),但有时候经常指望它被调用的时候没被调用,不希望它被调用的时候被调用了,搞的很上火。根据国外社区一个人帖子,做了总结性翻译。

layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews

2、addSubview会触发layoutSubviews

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、滚动一个UIScrollView会触发layoutSubviews

5、旋转Screen会触发父UIView上的layoutSubviews事件

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

2. – setNeedsLayout

3. – layoutIfNeeded

-setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

-layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]


抱歉!评论已关闭.