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]; }
こう書くのが無難だろう。