iOS自定义控件及相关小菜鸟的ios学习

iOS:关于UITableViewCell的宽度问题

2016-04-27  本文已影响3135人  婉卿容若

情景:今天试图对cell里面的一个view的左上角和右上角进行圆角处理,但是进行剪裁时cell显示的宽度就变窄了

如图

图1

cell文件里的代码

备注:backView距离cell左右各10px

 override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        
        print(self.bounds)
        print(backView.bounds)
        
        let maskPath = UIBezierPath(roundedRect: backView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight] , cornerRadii: CGSize(width: 10, height: 10))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = backView.bounds
        maskLayer.path = maskPath.CGPath
        backView.layer.mask = maskLayer
 
    }

我试图输入cell.bounds和backView.bounds,得到
->(0.0, 0.0, 320.0, 120.0)
->(0.0, 0.0, 300.0, 119.5)
问题来了,我模拟器是iphone6,cell宽度理论上是375,这里320是xib中的宽度,backview的宽度是300,剪裁后就在右边空出一片

原因:剪裁是在func awakeFromNib()初始化函数中,此时cell还是设计图时的大小,所以剪裁是在设计时的宽度下剪裁的,之后不再根据约束变化了(至于为什么不变化了,我也不清楚,如果读者知道,请告诉我,不胜感激)

解决方案:

将剪裁操作放入func layoutSubviews() 函数中'

 override func layoutSubviews() {
        
        super.layoutSubviews()

        print("hhhhhh:\(self.bounds)")
        print("wwwwww\(backView.bounds)")
        
        let maskPath = UIBezierPath(roundedRect: backView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight] , cornerRadii: CGSize(width: 10, height: 10))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = backView.bounds
        maskLayer.path = maskPath.CGPath
        backView.layer.mask = maskLayer 
    }

然而问题并没有解决
这里输出:
->hhhhhh:(0.0, 0.0, 375.0, 120.0)
->wwwwww(0.0, 0.0, 300.0, 119.5)
cell的bounds输出正确了,但backView得bounds仍然没有变化.
界面显示仍然是上图问题,滑动一会,重新布局,显示出我们想要的情况
所以不难知道,这里backView并没有立刻按照约束布局!而是我们滑动过程中进行了布局,frame发生变化,重新调用layoutSubviews()之后,界面变成想要的状态

所以,我们需要让backView立即根据约束进行布局,因而我们直接调用
backView.layoutIfNeeded()

override func layoutSubviews() {
        
        super.layoutSubviews()
        
        backView.layoutIfNeeded()
        
        print("hhhhhh:\(self.bounds)")
        print("wwwwww\(backView.bounds)")
     
        let maskPath = UIBezierPath(roundedRect: backView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight] , cornerRadii: CGSize(width: 10, height: 10))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = backView.bounds
        maskLayer.path = maskPath.CGPath
        backView.layer.mask = maskLayer

    }

至此,问题解决,结果如下图

图2.PNG
上一篇 下一篇

猜你喜欢

热点阅读