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