关于AutoLayout
关于AutoLayout
如果有十分动态的UI布局,比如说这种:
事实上,这个需求是:yellow和blue均有可能hidden。所以,将下面的ImageView跟yellow和blue还有top的约束设置不同的priority.因为他们都是要改变的,所以最高设为
999
(应该是对的吧),而不是1000.1000
一般是给固定不动的约束设置的priority.初始状态需要满足的就设为999,之后想满足的就设为750
及以下。等到需要改变的时候,就把999
的变小,750
的变大,这样就能够满足之后的约束条件。此时把其他两个hidden就好了。彦祖的简书blog
别用layout guide.
因为BottomLayoutGuide
是晚于View
加载的,如果参考这个,会造成进入页面会卡一下。尽量不要直接参考下面 TopLayoutGuide
则没事.所以每个imageview之类的,尽量放进view里面(就把他当做container
)
UILabel
把line设为0,定好宽度,这样就能自动换行了
IBInspectable的使用(UITextField)
设置textField的leftView
- (void)setLeftViewImage:(UIImage *)leftViewImage{
UIImageView *phoneLeftImageView = [[UIImageView alloc] initWithImage:leftViewImage];
self.frame = CGRectMake(0, 0, 25, 25);
self.leftView = phoneLeftImageView;
self.leftViewMode = UITextFieldViewModeAlways;
}
//重新定位
- (CGRect)leftViewRectForBounds:(CGRect)bounds{
CGRect textRect = [super leftViewRectForBounds:bounds];
textRect.origin.x += 10;
return textRect;
}
也可以这样
![Paste_Image.png](https://img.haomeiwen.com/i1204600/bcaafd4f37e5606b.png?imageMogr2/auto-
sunnyxxx博客的黑科技
//小括号内联复合表达式
RETURN_VALUE_RECEIVER = {(
// Do whatever you want
RETURN_VALUE; // 返回值
)};
如:
self.backgroundView = ({
UIView *view = [[UIView alloc] initWithFrame:self.view.bounds];
view.backgroundColor = [UIColor redColor];
view.alpha = 0.8f;
view;
});
这样让代码更加模块化
摘录
这里有一个需要特别注意的问题,也是效率问题。UITableView是一次性计算完所有Cell的高度,如果有1W个Cell,那么- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath就会触发1W次,然后才显示内容。不过在iOS7以后,提供了一个新方法可以避免这1W次调用,它就是- (CGFloat)tableView:(UITableView )tableView estimatedHeightForRowAtIndexPath:(NSIndexPath )indexPath。要求返回一个Cell的估计值,实现了这个方法,那只有显示的Cell才会触发计算高度的protocol. 由于[cell.contentView systemLayoutSizeFittingSize]
需要cell的一个实例才能计算,所以这儿用一个成员变量存一个Cell的实列,这样就不需要每次计算Cell高度的时候去动态生成一个Cell实例,这样即方便也高效也少用内存,可谓一举三得.
我们声明一个存计算Cell高度的实例变量:
@property (nonatomic, strong) UITableViewCell *prototypeCell;
然后初始化它:
self.prototypeCell = [self.tableView dequeueReusableCellWithIdentifier:@"C1"];
下面是计算Cell高度的实现:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
C1 *cell = (C1 *)self.prototypeCell;
cell.t.text = [self.tableData objectAtIndex:indexPath.row];
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
NSLog(@"h=%f", size.height + 1);
return 1 + size.height;
}
设定位于中心的正方形UIImageView
self.secondImageview.frame = CGRectMake(0, 0, 200, 200);
self.secondImageview.center = self.view.center;