概要
訳あって、久しぶりに以前Objective-cで作ったアプリを新しいOSに対応させています。最後の更新はかれこれ2年弱前なのでiOS8だったかな?(確かめようと思ったらapp store connectにつながらない)
その割にはあまり警告もエラーもなくて思ったより作業は早く終わりそうな予感(あまいか?)。
いくつかありますが、結構時間がかかったやつあげておきます。話が古すぎてあまり刺さる人は少ないと思いますが、一人でも参考になればと思っての投稿です。
現象
多分、iOS11以降だと思うのですが、シュミレータでios9のipadだと問題ないのに、ios13のipadだとUIPopoverに配置したボタンのラベルがずれて表示されます。
コードはこんな感じです。
- (id)init
{
CGRect buttonFrame = CGRectMake(0, 0, 280, 40);
self.popoverContentSize = buttonFrame.size;
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = buttonFrame;
[button setTitle:NSLocalizedString(@"ADD_TO_STAGE", @"ステージへ追加") forState:UIControlStateNormal];
[button addTarget:self action:@selector(pushAddStage:) forControlEvents:UIControlEventTouchUpInside];
UIViewController *viewCtrl = [[UIViewController alloc]init];
viewCtrl.view.frame = button.frame;
[viewCtrl.view addSubview:button];
self = [super initWithContentViewController:viewCtrl];
self.delegate = self;
return self;
}
解決策
UIPopoverはios11から吹き出しのところまでアイテムを置けるようになったようで、safeAreaLayoutGuideという枠内にコンテンツを配置しないと上記のようにはみ出るようです。
- (id)init
{
...
self = [super initWithContentViewController:viewCtrl];
if (@available(iOS 11.0, *)) {
UILayoutGuide* guide = viewCtrl.view.safeAreaLayoutGuide;
button.translatesAutoresizingMaskIntoConstraints = NO;
[button.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
[button.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
[button.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
[button.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
}
self.delegate = self;
return self;
}
参考
時間がかかったのはUIButtonの問題かと思ってUIButton textLabel
などで検索してしまったのが敗因。ボタンのラベルに色をつけたらUIPopoverの問題だとピンときました。
button.titleLabel.backgroundColor = [UIColor blackColor];
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
いつも助けてくれる例のサイトで情報発見。
感謝!!