[iOS 15][Obj-C] UIButton configurationUpdateHandler

iOS 15以降で、ボタンの動作変更方法が変わった。

ボタン押した時と、離した時で画像を変えたい場合

    [self.btnA setImage:[UIImage imageNamed:@"imgOff"] forState:UIControlStateNormal];
    [self.btnA setImage:[UIImage imageNamed:@"imgOn"] forState:UIControlStateHighlighted];

こんな感じでしたが、iOS 15からは、configurationUpdateHandlerを利用する形に。

    //Objective-C
    UIButtonConfiguration *cfg = [UIButtonConfiguration plainButtonConfiguration];
    [self.btnA setConfiguration:cfg];
        
    self.btnA.configurationUpdateHandler = ^(UIButton *btn){
        UIButtonConfiguration *cfg = btn.configuration;
        // ここで変更
        cfg.image = btn.isHighlighted ? [UIImage imageNamed:@"imgOn"]:[UIImage imageNamed:@"imgOff"];
        btn.configuration = cfg;
    };

ボタン押された時に、動的に実行されるような感じですね。

旧式のままでも、まぁ動きますが、

    if (@available(iOS 15.0, *)) {
        UIButtonConfiguration *cfg = [UIButtonConfiguration plainButtonConfiguration];
        [self.btnA setConfiguration:cfg];
        
        self.btnA.configurationUpdateHandler = ^(UIButton *btn){
            UIButtonConfiguration *cfg = btn.configuration;
            cfg.image = btn.isHighlighted ? [UIImage imageNamed:@"imgOn"]:[UIImage imageNamed:@"imgOff"];
            btn.configuration = cfg;
        };
    } else {
        // 〜iOS 14.x
        [self.btnA setImage:[UIImage imageNamed:@"imgOff"] forState:UIControlStateNormal];
        [self.btnA setImage:[UIImage imageNamed:@"imgOn"] forState:UIControlStateHighlighted];
    }

こう書くのが無難だろう。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする