UIButton 实现左图右文,并固定图文位置

杂

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

[btn setImage:[UIImage imageNamed:@"good_red.png"] forState:UIControlStateNormal];

[btn setTitle:@"11" forState:UIControlStateNormal];

UIButton设置了Image和Title后,默认就是左图右文。

但是当文字变长或变短的时候,UIButton会自动将图文居中,这就造成了图片移动的效果。

假如要固定图片的位置,只需要如下设置即可

[btn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 20)];

意思是图片相对于superView的上、左、下、右边距。

同理,假如要固定文字的位置,则

[btn setTitleEdgeInsets:UIEdgeInsetsMake(10, 0, 0, 0)];

 

setNeedsLayout layoutIfNeeded layoutSubviews

关于layoutSubviews调用时机:

1、init初始化不会触发layoutSubviews。

2、addSubview会触发layoutSubviews。

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

4、滚动一个UIScrollView会触发layoutSubviews。

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

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

7、直接调用setLayoutSubviews。

8、直接调用setNeedsLayout。

 

-layoutSubviews方法:这个方法,默认没有做任何事情,You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want. 

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

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

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

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

 

contentInset contentOffset

假如一个TableView的frame是一个屏幕的大小

UITableView *tv = [[UITableView alloc] initWithFrame:CGRectMake(0,0,screenWidth,screenHeight)];

此时将tableView分解为2个部分,一个是容器,容器的大小为tableView的frame;一个是内容视图,内容视图可以在容器中滚动。

容器的大小就是我们在任意时刻所能看到的内容的大小,而内容视图的大小要依据内容来确定。

滚动tableView的时候,其实滚动的是内容视图。

contentOffset是一个坐标,是内容视图的左上顶点和容器的左上顶点的实时的差,滚动时contentOffset是会变化的。

contentInset是一个左边,是内容视图的左上顶点和容器的左上顶点的初始时的差,滚动时contentInset是不会变化的。即最开始时,内容视图开始的坐标(相对于容器)。

 

你可能感兴趣的:(杂)