24

私は UIButton をサブクラス化しています。ボタンの種類を Round Rect に設定したいのです。

ボタン.h

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

ボタン.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 のサブクラス化は推奨されないと言われていましたが、開発者のドキュメントにはサブクラス化しないことについて言及されていないという事実を知っています。

4

8 に答える 8

13

CocoaBuilderのスレッドで議論を見つけることができますUIButtonをサブクラス化する方法は?特に、buttonTypeを無視するというJack Nuttingの提案は役に立ちました

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

于 2012-04-23T10:07:37.977 に答える
12

探しているものとはまったく異なりますが、サブクラスにはまだ buttonWithType メソッドがあり、正常に動作することを覚えておいてください。

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

SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect];
于 2013-09-12T16:26:29.580 に答える
2

便利な初期化を作成するとうまくいきました:

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*/
    }
}
于 2021-07-30T17:59:12.343 に答える
1

iOS7 では、UIButtonTypeSystem を使用する必要がある場合があり、init を単純にオーバーライドして [MyButton alloc] init] を実行することはできないため、これは以前よりも関連性が高くなります。フェード効果を強調します。

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

+ (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;
}
于 2014-05-30T03:52:44.493 に答える
0

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

于 2013-07-14T21:46:23.847 に答える
-2

これはどうですか?

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

    return self;
}
于 2012-04-23T09:37:37.137 に答える