Ios 如何在子类化视图时减少代码冗余?

Ios 如何在子类化视图时减少代码冗余?,ios,objective-c,uiview,uibutton,Ios,Objective C,Uiview,Uibutton,我需要修改UIButton、UIView和UIExtField等UIComponents。我需要做的只是将边界半径更改为圆形,而不是默认的锐利矩形 我这样做的方式是将UIView子类化为UIViewRoundCorner,UIButton子类化为UIButtonRoundCorner,UIExtField子类化为UIExtFieldRoundCorner,在每个子类中,我用以下命令覆盖了drawRect方法: - (void)drawRect:(CGRect)rect { // Draw

我需要修改UIButton、UIView和UIExtField等UIComponents。我需要做的只是将边界半径更改为圆形,而不是默认的锐利矩形

我这样做的方式是将UIView子类化为UIViewRoundCornerUIButton子类化为UIButtonRoundCornerUIExtField子类化为UIExtFieldRoundCorner,在每个子类中,我用以下命令覆盖了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有一个很好的特性,允许您向现有类添加行为:

您可以在
UIView
上的类别中添加一个方法(我们称之为
RoundedCorners
):

并与任何
UIView
子类一起使用:

UIButton *button = ...  //create a button somehow
[button ps_addRoundedCorners];

方法名称中的
ps\ucode>前缀用于避免名称冲突(以防其他人在私有框架中添加了同名的方法)。

这样做根本不需要子类化。Objective-C有一个很好的特性,允许您向现有类添加行为:

您可以在
UIView
上的类别中添加一个方法(我们称之为
RoundedCorners
):

并与任何
UIView
子类一起使用:

UIButton *button = ...  //create a button somehow
[button ps_addRoundedCorners];

方法名称中的
ps\ucode>前缀用于避免名称冲突(以防其他人在私有框架中添加了同名的方法)。

这样做根本不需要子类化。Objective-C有一个很好的特性,允许您向现有类添加行为:

您可以在
UIView
上的类别中添加一个方法(我们称之为
RoundedCorners
):

并与任何
UIView
子类一起使用:

UIButton *button = ...  //create a button somehow
[button ps_addRoundedCorners];

方法名称中的
ps\ucode>前缀用于避免名称冲突(以防其他人在私有框架中添加了同名的方法)。

这样做根本不需要子类化。Objective-C有一个很好的特性,允许您向现有类添加行为:

您可以在
UIView
上的类别中添加一个方法(我们称之为
RoundedCorners
):

并与任何
UIView
子类一起使用:

UIButton *button = ...  //create a button somehow
[button ps_addRoundedCorners];
方法名称中的
ps\uu
前缀用于避免名称冲突(如果其他人在私有框架中添加了同名的方法)

您可以创建一个协议并扩展该协议以进行默认实现。然后对于每个需要角半径的自定义视图,只需实现该协议。通过这种方式,您可以最小化代码冗余

您可以创建一个协议并扩展该协议以进行默认实现。然后对于每个需要角半径的自定义视图,只需实现该协议。通过这种方式,您可以最小化代码冗余

您可以创建一个协议并扩展该协议以进行默认实现。然后对于每个需要角半径的自定义视图,只需实现该协议。通过这种方式,您可以最小化代码冗余


您可以创建一个协议并扩展该协议以进行默认实现。然后对于每个需要角半径的自定义视图,只需实现该协议。通过这种方式,您可以最大限度地减少代码冗余。

FYI-使用
drawRect:
调整图层不是正确的做法
drawRect:
可以在控件的生命周期内多次调用,但只需调整层一次。使用适当的
init…
方法进行操作。感谢您的建议:)。我将立即实施。仅供参考-使用
drawRect:
调整图层不是正确的做法
drawRect:
可以在控件的生命周期内多次调用,但只需调整层一次。使用适当的
init…
方法进行操作。感谢您的建议:)。我将立即实施。仅供参考-使用
drawRect:
调整图层不是正确的做法
drawRect:
可以在控件的生命周期内多次调用,但只需调整层一次。使用适当的
init…
方法进行操作。感谢您的建议:)。我将立即实施。仅供参考-使用
drawRect:
调整图层不是正确的做法
drawRect:
可以在控件的生命周期内多次调用,但只需调整层一次。使用适当的
init…
方法进行操作。感谢您的建议:)。我会马上实现。为什么不扩展UIview本身而不是扩展一个协议?为什么不扩展UIview本身而不是扩展一个协议?为什么不扩展UIview本身而不是扩展一个协议?为什么不扩展UIview本身而不是扩展一个协议??