这是一个产品由来以久的问题,结果伴随着新版本的测试上线,设计表示实在忍无可忍(明显欺负我新来的嘛),只好花时间去看看这个问题怎么回事。
圆角描边问题
首先说明设计的规范:
1.圆角长宽都为矩形高度一半
2.圆角描边宽度borderWidth为1单位
3.被点击时表框也需要变化
由于第三点,因此不能使用系统默认样式,这是业务前提。
我们可以先看看系统默认样式下的表现,描边宽度为1单位(即button.layer.borderWidth = 1)
可以看到定义.layer.borderWidth为1单位的时候,宽度其实是2px
然后看一下我们自己写的按钮,同样定义描边宽度为1单位
可以看出问题在于圆角变成了只有一个像素,也就是0.5单位。
这个问题其实在版本中一直存在,只是因为描边按钮的曝光机会不大因此一直没有修改(设计其实已经多次提出)
这次在一个主要页面会有两次曝光,因此一定要解决这个问题。
原版本实现分析
首先讲一下这个有问题的圆角是怎么实现的。
为了实现点击时描线框可以改变颜色,并且考虑到效率问题,这整个描线框其实是一个继承UIImageView的view
也就是说这个描线框是按钮(继承UIButton)的backgroudView而非layer一部分,在此基础上所有对按钮的描线框、背景的设置其实都是由一个view来响应。
@interface RoundedRectangle : UIImageView
@property(nonatomic,assign) CGFloat cornerRadius;
@property(nonatomic,assign) CGFloat borderWidth;
@property(nonatomic,strong) UIColor *borderColor;
@end
这个定义很好理解,当上面参数变化的时候都会调用刷新背景的方法:- (void)_updateDisplay
因此我们下面聚焦这个方法