问题如下:
笔者为了省事,在开发某个页面时是通过xib直接画的页面,然后在真机运行时为了让该页面适配不同机型所以在
xxx = [[[NSBundle mainBundle] loadNibNamed:@"xxx" owner:self options:nil] firstObject];
之后设置xxx的frame,
xxx.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
但是xxx页面上有个控件需要设置半圆角,于是笔者在xxx类的.m里面的 awakeFromNib方法做了如下操作
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
//TODO:uiview 单边圆角或者单边框
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_alert_view.bounds byRoundingCorners:(UIRectCornerBottomRight | UIRectCornerBottomLeft) cornerRadii:CGSizeMake(5,5)];//圆角大小
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = _alert_view.bounds;
maskLayer.path = maskPath.CGPath;
_alert_view.layer.mask = maskLayer;
//解决不同机型界面上还是顽固的显示xib上的尺寸大小
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.translatesAutoresizingMaskIntoConstraints = YES;
}
备注:_alert_view设置了约束距离屏幕左右两边均为15
由于xib绘制页面时屏幕宽度是5s的宽度,当该页面在iPhoneX上运行时_alert_view的尺寸大小变成了
究其原因是因为在xxx = [[[NSBundle mainBundle] loadNibNamed:@"xxx" owner:self options:nil] firstObject];时就执行了awakeFromNib该方法,由于设置半圆角代码
askLayer.frame = _alert_view.bounds;
maskLayer.path = maskPath.CGPath;
_alert_view.layer.mask = maskLayer;
的原因针对_alert_view改变了其frame,此时在设置
xxx.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
想改变xxx的frame进而通过约束想改变_alert_view的frame已经无法生效,因此解决方法就是把设置半圆角的代码延迟执行
[self performSelector:@selector(layoutMyCorner) withObject:nil afterDelay:.0];
这样在整个页面加载完毕frame已经设置正确 在执行设置圆角的代码就可以解决上述问题