在 iOS 中编写 UIButtons 时避免代码重复

Posted

技术标签:

【中文标题】在 iOS 中编写 UIButtons 时避免代码重复【英文标题】:Avoid code repetition when coding UIButtons in iOS 【发布时间】:2011-09-09 22:38:33 【问题描述】:

总的来说,我对 ios 编程和 Objective-C 还很陌生,所以这个问题可能已经被问过几次了。无论如何:

在我的 iOS 应用程序中,我有几个 UIButton,我通过以下方式创建:

UIButton *webButton = [UIButton buttonWithType:UIButtonTypeCustom];
[webButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
webButton.frame = CGRectMake(10, 315, 300, 44);
[webButton setBackgroundImage:[UIImage imageNamed:@"WebButton.png"] forState:UIControlStateNormal];
[webButton setBackgroundImage:[UIImage imageNamed:@"WebButtonPressed.png"] forState:UIControlStateHighlighted];

由于我希望按钮的标题易于编辑,因此我将 UILabel 添加到按钮中,而不是让它们成为用作按钮背景图像的图像的一部分。

UILabel *webLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 14, 300, 15)];
webLabel.text = @"Some website";
webLabel.font = [UIFont boldSystemFontOfSize:16.0];
webLabel.textColor = [UIColor colorWithRed:62.0 / 255 green:135.0 / 255 blue:203.0 / 255 alpha:1];
webLabel.textAlignment = UITextAlignmentCenter;
webLabel.backgroundColor = [UIColor clearColor];
[webButton addSubview:webLabel];
[webLabel release];

当您每次想要创建一个新按钮时都必须执行此过程时,这会变得非常乏味。简化此过程的最佳方法是什么,这样我在编写按钮时就不必一遍又一遍地重复自己?

谢谢。

【问题讨论】:

一个简单的子程序怎么样?不需要花哨的子类或任何东西,只需将大部分逻辑放在通用例程中即可。 如果您反复使用相同的颜色,您可以复制一份并分享。 【参考方案1】:

我怀疑你想要做的是创建一个 UIButton 的子类。这样,您只需编写一次代码,就可以将其用于任意数量的按钮。有点像这样:

// in your .h file

#import <UIKit/UIKit.h>
@interface WebButton : UIButton
+ (WebButton*) webButtonWithBackgroundImageNamed: (NSString*) imageName title: (NSString*) string andTarget: (id) target;
@end

// in your .m file
#import "WebButton.h"
@implementation WebButton

+ (WebButton*) webButtonWithBackgroundImageNamed: (NSString*) imageName title: (NSString*) string andTarget: (id) target;

    WebButton *webButton = [WebButton buttonWithType:UIButtonTypeCustom];
    [webButton addTarget:target action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    webButton.frame = CGRectMake(0, 0, 300, 44);
    [webButton setBackgroundImage:[UIImage imageNamed: imageName] forState:UIControlStateNormal];
    [webButton setBackgroundImage:[UIImage imageNamed: [NSString stringWithFormat:@"%@pressed", imageName]] forState:UIControlStateHighlighted];

     UILabel *webLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 14, 300, 15)];
     webLabel.text = string;
     webLabel.font = [UIFont boldSystemFontOfSize:16.0];
     webLabel.textColor = [UIColor colorWithRed:62.0 / 255 green:135.0 / 255 blue:203.0 / 255 alpha:1];
     webLabel.textAlignment = UITextAlignmentCenter;
     webLabel.backgroundColor = [UIColor clearColor];
     [webButton addSubview:webLabel];
     [webLabel release];

     return webButton;

然后创建按钮并将其添加到视图中,有点像这样:

WebButton* webButton = [WebButton webButtonWithBackgroundImageNamed:@"WebButton" title:@"testing" andTarget:self];
CGRect webButtonFrame = [webButton frame];
webButtonFrame.origin.x = 10;
webButtonFrame.origin.y = 30;
[webButton setFrame:webButtonFrame];
[[self window] addSubview:webButton];

【讨论】:

以上是关于在 iOS 中编写 UIButtons 时避免代码重复的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 的问题和滚动包含 UIButtons 的 UIScrollView

UIButtons 在动画期间没有响应 - iOS Swift 3

运行时有吸引力的 iOS UIButtons

我应该如何在 iOS 7 中使用具有 iOS 6 风格的 UIButtons?

iOS 相机应用程序中的可拖动 UIButtons

带有改变大小的 UIButtons 的 iOS 回流布局