如何设置的UIButton类型的UIButton子类(how to set UIButton typ

2019-06-23 21:11发布

我子类的UIButton,我想要的是按钮类型设置为圆矩形。

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的,但事实是,在开发者文档有大约不是继承它没有提及。

Answer 1:

您可能会发现在CocoaBuilder的线程讨论如何继承的UIButton? 有用,尤其是杰克·纳丁的建议忽略按钮类型 :

需要注意的是这样的按钮类型未明确设置任何东西,这可能意味着它UIButtonTypeCustom。 该文件似乎并没有真正具体规定,但因为这是在枚举0值,这是有可能发生的事情(这似乎是观察到的行为为好)



Answer 2:

不太你在找什么,但请记住,你的子类仍具有buttonWithType方法,并能正常工作。

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

SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect];


Answer 3:

UIButton子类斯威夫特

*下面的代码在斯威夫特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代替。

在Xcode以下是从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
}


Answer 4:

随着iOS7,这是比以前更加重要,因为有时你需要使用UIButtonTypeSystem,你不能简单地覆盖init和做[myButton的页头]初始化],因为那是一个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;
}


Answer 5:

你一定可以继承的UIButton。 我已经成功地创建一个DateButton它看起来像一个的UITextField,但是当用户触摸它,它会显示在酥料饼的一个datepicker。 具有用于存储日期等让我知道,如果上面从来没有解决你的问题,我会更多的细节后的属性。



Answer 6:

那这个呢?

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

    return self;
}


文章来源: how to set UIButton type in UIButton Subclass