0
0

More than 3 years have passed since last update.

UIPopoverのラベルがiOS13でズレる。

Posted at

概要

訳あって、久しぶりに以前Objective-cで作ったアプリを新しいOSに対応させています。最後の更新はかれこれ2年弱前なのでiOS8だったかな?(確かめようと思ったらapp store connectにつながらない)

その割にはあまり警告もエラーもなくて思ったより作業は早く終わりそうな予感(あまいか?)。

いくつかありますが、結構時間がかかったやつあげておきます。話が古すぎてあまり刺さる人は少ないと思いますが、一人でも参考になればと思っての投稿です。

現象

多分、iOS11以降だと思うのですが、シュミレータでios9のipadだと問題ないのに、ios13のipadだとUIPopoverに配置したボタンのラベルがずれて表示されます。

ios9
iPad_Air_2_—_9_3.png

ios13
iPad_Pro__11-inch__—_13_3.png

コードはこんな感じです。

- (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;

iPad_Pro__11-inch__—_13_3-2.png

いつも助けてくれる例のサイトで情報発見。

感謝!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0