升级到 iOS 11 后弹出错误的位置

Posted

技术标签:

【中文标题】升级到 iOS 11 后弹出错误的位置【英文标题】:Misplaced popover after upgrading to iOS 11 【发布时间】:2017-11-20 14:47:57 【问题描述】:

自从升级到 ios 11 后,我开始遇到错误放置的弹出框的问题,它的框架通常由presentPopoverFromRect:sender.frame 设置为导航栏按钮的坐标,从而触发了操作。

问题:(UIButton *)sender.frame 的 x 和 y 坐标等于 0,0,并且弹出框显示在屏幕的左上角。

这里是generateToolbar() 方法,它生成用户导航按钮。

-(void) generateToolbar 

    // Initialize the `ButtonFactory`

    ButtonFactory *buttonFactory = [[ButtonFactory alloc] init];

    // Generate some UIButton(s)

    UIButton *userUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeUser iconVisibility:YES textVisibility:NO capitalization:NO iconSize:20 textSize:10];
    userUIBtn.frame = CGRectMake(0,0,55,20);
    [userUIBtn addTarget:self action:@selector(userButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    // Generate an `UIBarButtonItem` with the `UIButton` as basis

    UIBarButtonItem *userBtn = [[UIBarButtonItem alloc] initWithCustomView:userUIBtn];

    // Add the `UIBarButtonItem` into the right side of the `navigationItem`

    self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: userBtn, nil];

    DDLogVerbose(@"A: generateToolbar UIButton FRAME: %@",NSStringFromCGRect(userUIBtn.frame));


这里是 userButtonPressed() 方法,它通过按下 user 按钮触发并在该按钮周围生成一个弹出框。

- (IBAction) userButtonPressed:(UIButton *)sender 

    // Initialize the `ButtonFactory`

    ButtonFactory *buttonFactory = [[ButtonFactory alloc] init];

    // Generate some UIButtons        

    UIButton *feedbackUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeFeedback iconVisibility:YES textVisibility:YES capitalization:NO iconSize:20.0 textSize:20.0];
    [feedbackUIBtn addTarget:self action:@selector(feedbackBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
    feedbackUIBtn.frame = CGRectMake(0,50,300,50);

    // Create a `UIViewController` and add the `UIButtons` as subviews

    UIViewController *viewController = [[UIViewController alloc] init];
    [viewController.view addSubview:feedbackUIBtn];
    [viewController.view addSubview:crashUIBtn];

    // Create the `UIPopoverController`

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
    self.mainPopoverController = [[UIPopoverController alloc] initWithContentViewController:navigationController];
    self.mainPopoverController.popoverContentSize = CGSizeMake(300, 100); 

    DDLogVerbose(@"B: userButtonPressed SENDER FRAME: %@",NSStringFromCGRect(sender.frame));

    // Present the `UIPopoverController`

    [self.mainPopoverController presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections: UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES];

日志输出——两处x、y坐标都等于0, 0,这是错误的,它们应该是非零且等于UIBarButtonItem的实际坐标:

A: generateToolbar UIButton FRAME: 0, 0, 55, 20
B: userButtonPressed SENDER FRAME: 0, 0, 55, 32

【问题讨论】:

请仅在您的问题中显示 相关 代码 - 不要让我们必须通读您的 NSAttributedString 分配。也许读过minimal reproducible example 【参考方案1】:

“导航栏按钮坐标”的概念没有意义,因为 UIBarButtonItem 不是 UIView 并且没有 frame。将弹出箭头指向 UIBarButtonItem 的方法是设置弹出显示控制器的barButtonItem。 (popover presentation 控制器:在这个时代你不应该使用 UIPopoverController。)

【讨论】:

你的意思是我应该用[self.mainPopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES]替换[self.mainPopoverController presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections: UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES];?有一个问题,它们是不兼容的类型UIButtonUIBarButtonItem 我的意思是你根本不应该打电话给presentPopoverFromRect。你生活在哪个年代? UIPopoverController 很久以前就被弃用了。使用现代弹出框并使用该程序。

以上是关于升级到 iOS 11 后弹出错误的位置的主要内容,如果未能解决你的问题,请参考以下文章

“喜欢它”后弹出窗口中的内容错误

iOS 类似复制链接打开淘宝APP后弹出页面功能

AgileController Portal认证成功后弹出找不到指定位置的资源

将 jQuery 从 1.11.1 升级到 3.3.1 后的弹出问题

升级到 Xcode 11.x 后出现 UISegmentedControl 错误

H5页面在微信浏览器打开 ios 键盘收起后弹出层焦点错位