Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

SwiftでUIButtonTypeが.customのサブクラスを作る

More than 3 years have passed since last update.

UIButtonをカスタマイズする際に、UIButtonのサブクラスを作ると思います。

そのクラスをボタンに適用する方法として、Storyboardの場合はXcodeの Custom Class にクラス名を設定し、併せてButtonのTypeを Custom に設定します。これを忘れるとボタンが意図した挙動にならなかったりします。

xcode.png

そこで、サブクラス内にコードでButtonTypeを設定できれば良いのでは?
と思い調べてみました。


Objective-C時代には、init内で

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame: frame];
    if (self) {
        self = [UIButtonbuttonWithType: UIButtonTypeCustom];
    }
    return self;
}

みたいなこともできたようです。(動作未検証)


ですが、Swift場合は、 self への代入はできませんでした。

self = UIButton(type: .custom)

// Cannot assign to value: 'self' is immutable

また、 buttonType というプロパティがあったのですが、

buttonType = .custom

// 'buttonType' is a get-only property

読み出し専用だと怒られてしまいます。


ここで、ひとつの疑問が浮かびました。

「コードだけで .custom なサブクラスはどうやってつくるのか?」

下記ページによると、Swiftでは UIButton のサブクラスは .custom がデフォルトとのことです。

http://stackoverflow.com/questions/27079681/how-to-init-a-uibutton-subclass


検証してみましょう。

let button = MyCustomButton()
print(button.buttonType.rawValue)

// 0

0が出力されました。

UIButtonTypeの定義部分をみるとcustom = 0 で正しいようです。

public enum UIButtonType : Int {
    case custom
    case system
    case detailDisclosure
    case infoLight
    case infoDark
    case contactAdd
}

この場合は、未設定なのでデフォルト値の custom になってると言った方が正しいでしょうか。

そして残念ながら、ButtonTypeをCustomに設定し忘れる問題をコード側で解決することはできないようです。


結論

  • コードの場合はデフォルトで.customの設定となる
  • Storyboardの場合は忘れずにButtonのTypeをCustomに設定する
keygx
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away