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)];
关于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]
假如一个TableView的frame是一个屏幕的大小
UITableView *tv = [[UITableView alloc] initWithFrame:CGRectMake(0,0,screenWidth,screenHeight)];
此时将tableView分解为2个部分,一个是容器,容器的大小为tableView的frame;一个是内容视图,内容视图可以在容器中滚动。
容器的大小就是我们在任意时刻所能看到的内容的大小,而内容视图的大小要依据内容来确定。
滚动tableView的时候,其实滚动的是内容视图。
contentOffset是一个坐标,是内容视图的左上顶点和容器的左上顶点的实时的差,滚动时contentOffset是会变化的。
contentInset是一个左边,是内容视图的左上顶点和容器的左上顶点的初始时的差,滚动时contentInset是不会变化的。即最开始时,内容视图开始的坐标(相对于容器)。