如何在子类化视图时减少代码冗余?
How to reduce code redundancy while subclassing views?
我有一个要求,我需要更改 UIComponents,如 UIButton、UIView 和 UITextField。我需要做的只是将边框的半径更改为圆形而不是默认的锐角矩形。
我这样做的方法是将 UIView 子类化为 UIViewRoundCorner,UIButton 为 UIButtonRoundCorner,UITextField 为 UITextFieldRoundCorner 在每个子类中我都用这个重写了 drawRect 方法:
- (void)drawRect:(CGRect)rect {
// Drawing code
CALayer *layer = [self layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:3.0f];
[layer setBorderWidth:1.0f];
}
该代码是多余的,我正在尝试弄清楚如何删除此冗余。由于所有这些元素都是从 UIView 继承的,是否有可能以某种方式继承 UIView 并在所有其他视图中实现?
你根本不需要子类化来做到这一点。 Objective-C 有一个很棒的功能,它允许您向 现有的 添加行为 类: categories.
您可以在 UIView
上的类别中添加方法(我们称之为 RoundedCorners
):
@implementation UIView (RoundedCorners)
- (void)ps_addRoundedCorners;
@end
@implementation UIView (RoundedCorners)
- (void)ps_addRoundedCorners {
CALayer *layer = [self layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:3.0f];
[layer setBorderWidth:1.0f];
}
@end
并将其与任何 UIView
子类一起使用:
UIButton *button = ... //create a button somehow
[button ps_addRoundedCorners];
方法名称中的ps_
前缀用于避免名称冲突(以防其他人在私有框架中添加了同名方法)。
protocol RoundedCorner {
func makeCornerRadius(radius:CGFloat)
}
extension RoundedCorner where Self:UIView{
func makeCornerRadius(radius:CGFloat){
self.layer.cornerRadius = radius
}
}
class CustomButton: UIButton, RoundedCorner {
override func drawRect(rect: CGRect) {
super.drawRect(rect)
self.makeCornerRadius(5)
}
}
您可以创建协议并扩展该协议以实现默认实现。然后对于您想要圆角半径的每个自定义视图,只需实施该协议即可。这样您就可以最大限度地减少代码冗余。
我有一个要求,我需要更改 UIComponents,如 UIButton、UIView 和 UITextField。我需要做的只是将边框的半径更改为圆形而不是默认的锐角矩形。
我这样做的方法是将 UIView 子类化为 UIViewRoundCorner,UIButton 为 UIButtonRoundCorner,UITextField 为 UITextFieldRoundCorner 在每个子类中我都用这个重写了 drawRect 方法:
- (void)drawRect:(CGRect)rect {
// Drawing code
CALayer *layer = [self layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:3.0f];
[layer setBorderWidth:1.0f];
}
该代码是多余的,我正在尝试弄清楚如何删除此冗余。由于所有这些元素都是从 UIView 继承的,是否有可能以某种方式继承 UIView 并在所有其他视图中实现?
你根本不需要子类化来做到这一点。 Objective-C 有一个很棒的功能,它允许您向 现有的 添加行为 类: categories.
您可以在 UIView
上的类别中添加方法(我们称之为 RoundedCorners
):
@implementation UIView (RoundedCorners)
- (void)ps_addRoundedCorners;
@end
@implementation UIView (RoundedCorners)
- (void)ps_addRoundedCorners {
CALayer *layer = [self layer];
[layer setMasksToBounds:YES];
[layer setCornerRadius:3.0f];
[layer setBorderWidth:1.0f];
}
@end
并将其与任何 UIView
子类一起使用:
UIButton *button = ... //create a button somehow
[button ps_addRoundedCorners];
方法名称中的ps_
前缀用于避免名称冲突(以防其他人在私有框架中添加了同名方法)。
protocol RoundedCorner {
func makeCornerRadius(radius:CGFloat)
}
extension RoundedCorner where Self:UIView{
func makeCornerRadius(radius:CGFloat){
self.layer.cornerRadius = radius
}
}
class CustomButton: UIButton, RoundedCorner {
override func drawRect(rect: CGRect) {
super.drawRect(rect)
self.makeCornerRadius(5)
}
}
您可以创建协议并扩展该协议以实现默认实现。然后对于您想要圆角半径的每个自定义视图,只需实施该协议即可。这样您就可以最大限度地减少代码冗余。