如何在UIButton子类中设置UIButtontypes

我是UIButton的子类,我想要的是将buttontypes设置为Round Rect。

Button.h

@interface Button : UIButton {} - (void)initialize; @end 

Button.m

 @implementation Button - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initialize]; } return self; } -(id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if(self){ [self initialize]; } return self; } - (void)initialize { self.titleLabel.font = [UIFont systemFontOfSize:20]; self.titleLabel.textColor = [UIColor redColor]; self.titleLabel.textAlignment = UITextAlignmentCenter; //[UIButton buttonWithType:UIButtonTypeRoundedRect]; } @end 

在这里我试过[UIButton buttonWithType:UIButtonTypeRoundedRect]但它不工作。 任何人都可以build议如何使其工作?

我知道在很多以前的文章中有人说,不build议子类化UIButton,但是在开发人员文档中没有提到关于不子类化的事实。

你可以在CocoaBuilder的线程中find讨论如何inheritanceUIButton? 特别是Jack Nuttingbuild议忽略buttonType :

请注意,这种方式buttonType不明确设置为任何东西,这可能意味着它是UIButtonTypeCustom。 Docs似乎没有具体说明,但是因为这是枚举中的0值,所以可能发生了什么(这似乎也是可观察的行为)

不是你正在寻找的东西,但要记住你的子类仍然有buttonWithType方法,并且工作正常。

buttonWithType调用你的子类initWithFrame,并适当地设置types。

 SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect]; 

Swift中的UIButton子类

*以下代码在Swift 3及更高版本中可用。

您不能通过devise设置UIButton子类的buttonType 。 这是自动设置为custom ,这意味着你得到一个简单的外观和行为作为一个起点。

如果要重新使用设置button外观的代码,则可以在不进行子类化的情况下执行此操作。 一种方法是通过提供工厂方法来创buildUIButton并设置可视属性。

避免子类化的工厂方法示例

 extension UIButton { static func createStandardButton() -> UIButton { let button = UIButton(type: UIButtonType.system) button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) button.setTitleColor(UIColor.black, for: .normal) button.setTitleColor(UIColor.gray, for: .highlighted) return button } } let button = UIButton.createStandardButton() 

当其他定制技术足够时,我避免了UIButton 。 工厂方法的例子是一个选项。 还有其他选项,包括UIAppearance API等

有时需要子类化的定制需求。 例如,我已经创build了UIButton子类,以精确控制button如何响应触摸事件animation,或者让button在点击时调用预定义的委托或闭包(而不是为每个实例分配一个#selector )。

以下是一个基本的UIButton子类的例子作为一个起点。

示例UIButton子类

 internal class CustomButton: UIButton { init() { // The frame can be set outside of the initializer. Default to zero. super.init(frame: CGRect.zero) initialize() } required init?(coder aDecoder: NSCoder) { // Called when instantiating from storyboard or nib super.init(coder: aDecoder) initialize() } func initialize() { print("Execute common initialization code") } } let button = CustomButton() print(button.buttonType == .custom) // true 

关于UIButtonType

自2012年问题提出以来, UIButtonType.roundedRect已被弃用。 头文件注释说,使用UIButtonType.system代替。

以下是从Xcode中转换为Swift的UIButton.h

 public enum UIButtonType : Int { case custom // no button type @available(iOS 7.0, *) case system // standard system button case detailDisclosure case infoLight case infoDark case contactAdd public static var roundedRect: UIButtonType { get } // Deprecated, use UIButtonTypeSystem instead } 

在iOS7中,这比以前更相关,因为有时你需要使用UIButtonTypeSystem,而且你不能简单地重写init和do [MyButton alloc] init],因为这是一个UIButtonTypeCustom,它并不反映tintColor,也没有很好的突出淡化效果。

为了inheritance,创build一个静态构造函数,如下所示:

 + (instancetype)myButtonWithTitle:(NSString *)title imageNamed:(NSString *)imageName target:(id)target action:(SEL)action { MyButton *button = [self buttonWithType:UIButtonTypeSystem]; ... my custom setup for title, image, target, etc ... return button; } 

你可以绝对子类UIButton。 我已经成功地创build了一个看起来像UITextField的DateButton,但是当用户触摸它时,它会在Popover中显示一个DatePicker。 有一个属性来存储date等,让我知道如果上面没有解决你的问题,我会张贴细节更多。

那这个呢?

 - (id)initWithFrame:(CGRect)frame { self = [UIButton buttonWithType:UIButtonTypeRoundedRect]; if (self) { self.frame = frame; } return self; }