问题如下:

笔者为了省事,在开发某个页面时是通过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的尺寸大小变成了

加载XIB绘制的页面时的注意事项

究其原因是因为在xxx = [[[NSBundle mainBundleloadNibNamed:@"xxx" owner:self options:nilfirstObject];时就执行了awakeFromNib该方法,由于设置半圆角代码

askLayer.frame = _alert_view.bounds;

maskLayer.path = maskPath.CGPath;

_alert_view.layer.mask = maskLayer;

的原因针对_alert_view改变了其frame,此时在设置

xxx.frame = CGRectMake(00kScreenWidthkScreenHeight);

想改变xxx的frame进而通过约束想改变_alert_view的frame已经无法生效,因此解决方法就是把设置半圆角的代码延迟执行

[self performSelector:@selector(layoutMyCorner) withObject:nil afterDelay:.0];

这样在整个页面加载完毕frame已经设置正确 在执行设置圆角的代码就可以解决上述问题





相关文章: