如何在UIButton子类中设置UIButton类型

时间:2012-04-23 09:24:21

标签: ios uibutton subclass

我是UIButton的子类,我想要的是将按钮类型设置为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],但它不起作用。任何人都可以建议如何使它工作?

我在之前的很多文章中都知道,不推荐使用子类化UIButton,但事实上在Developer's Docs中没有提及NOT子类化它。

8 个答案:

答案 0 :(得分:11)

您可能会发现CocoaBuilder的主题How to subclass UIButton?上的讨论很有帮助,尤其是Jack Nutting's suggestion to ignore the buttonType

  

请注意,这样buttonType不会显式设置为任何内容,   这可能意味着它的UIButtonTypeCustom。文件没有   似乎实际上指定了,但因为那是0中的值   enum,这可能发生了什么(这似乎是可观察的   行为也是如此)

答案 1 :(得分:8)

不是你想要的,但请记住你的子类仍然有buttonWithType方法,并且它工作正常。

buttonWithType调用您的子类initWithFrame,并相应地设置类型。

SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect];

答案 2 :(得分:7)

Swift 中的

UIButton子类

*以下代码适用于Swift 3及更高版本。

您无法按设计设置buttonType子类的UIButton。它会自动设置为custom,这意味着您可以将简单的外观和行为作为起点。

如果要重用设置按钮外观的代码,可以在不进行子类化的情况下执行此操作。一种方法是提供创建UIButton并设置视觉属性的工厂方法。

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

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等。

有时需要进行子类化的自定义需求。例如,我创建了UIButton子类来精确控制按钮动画响应触摸事件的方式,或者在按下时按钮调用预定义的委托或闭包(而不是分配#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代替。

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

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
}

答案 3 :(得分:1)

使用iOS7时,这比以前更有意义,因为有时你需要来使用UIButtonTypeSystem,你不能简单地覆盖init并执行[MyButton alloc] init],因为那样& #39; sa UIButtonTypeCustom,它不反映tintColor,也没有很好的高亮淡化效果。

要创建子类,请创建一个静态构造函数:

+ (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;
}

答案 4 :(得分:0)

你绝对可以继承UIButton。我已经成功创建了一个看起来像UITextField的DateButton,但是当用户触摸它时,它会在Popover中显示一个DatePicker。有一个存储日期的属性等。如果以上内容从未解决您的问题,请告诉我,我会发布更多详细信息。

答案 5 :(得分:0)

这不是一个好的解决方案,因此我们需要感谢Apple使用此拐杖。 XD

//if self.buttonType == .system && self.state.contains(.highlighted) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
        self.titleLabel?.alpha = 1.0
    }
//}

例如添加touchesBegan(...)

答案 6 :(得分:0)

创建一个方便的 init 对我有用:

class CustomButton: UIButton {
    
    convenience init() {
        self.init(type: .system)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        /*Do customization here*/
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        
        /*Do customization here*/
    }
}

答案 7 :(得分:-1)

这个怎么样?

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

    return self;
}