web-dev-qa-db-ja.com

UIButtonサブクラスでUIButtonタイプを設定する方法

UIButtonをサブクラス化しています。必要なのは、ボタンタイプをRoundRectに設定することです。

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'sDocsではサブクラス化しないことについては言及されていません。

18
Haris Hussain

CocoaBuilderのスレッドでの議論を見つけることができます IButtonをサブクラス化する方法? 特に buttonTypeを無視するJack Nuttingの提案

この方法では、buttonTypeが明示的に何にも設定されていないことに注意してください。これは、おそらくUIButtonTypeCustomであることを意味します。ドキュメントは実際にはそれを指定していないようですが、それは列挙型の0値であるため、おそらくそれが起こります(そして、それは観察可能な動作でもあるようです)

11
Caleb

探しているものとは異なりますが、サブクラスにはまだbuttonWithTypeメソッドがあり、正常に機能することを忘れないでください。

buttonWithTypeは、サブクラスinitWithFrameを呼び出し、タイプを適切に設定します。

SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect];
10
Confused Vorlon

SwiftのUIButtonサブクラス

*次のコードはSwift 3以降で機能します。

設計上、buttonTypeサブクラスのUIButtonを設定することはできません。自動的にcustomに設定されます。これは、開始点としてわかりやすい外観と動作が得られることを意味します。

ボタンの外観を設定するコードを再利用する場合は、サブクラス化せずにこれを行うことができます。 1つのアプローチは、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のサブクラス化を避けます。ファクトリメソッドの例は1つのオプションです。 UIAppearanceAPIなどを含む他のオプションがあります。

サブクラス化を必要とするカスタマイズのニーズがある場合があります。たとえば、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で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
}
9
Mobile Dan

IOS7では、これは以前よりも関連性が高くなります。UIButtonTypeSystemを使用する場合はneedであり、単にinitをオーバーライドして[MyButton alloc] init]を実行することはできません。これは、UIButtonTypeCustomであるためです。 tintColorを反映せず、Niceハイライトフェード効果もありません。

サブクラス化するには、次のような静的コンストラクターを作成します。

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

あなたは間違いなくUIButtonをサブクラス化することができます。 UITextFieldのように見えるDateButtonを正常に作成しましたが、ユーザーがそれに触れると、ポップオーバーにDatePickerが表示されます。日付などを保存するプロパティがあります。上記で問題が解決しない場合はお知らせください。詳細を投稿します。

0