Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIPopover presentFromBarButton偏心_Ios_Uibarbuttonitem_Uipopovercontroller - Fatal编程技术网

Ios UIPopover presentFromBarButton偏心

Ios UIPopover presentFromBarButton偏心,ios,uibarbuttonitem,uipopovercontroller,Ios,Uibarbuttonitem,Uipopovercontroller,我在一个项目中注意到,由于某种原因,右栏按钮项目上方的popover位置似乎偏右。我尝试使用自定义视图的UIButton,然后从该按钮显示popover,但是如果我实际为showFromRect提供“居中”值,popover似乎会忽略它 这背后的代码非常简单: - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:

我在一个项目中注意到,由于某种原因,右栏按钮项目上方的popover位置似乎偏右。我尝试使用自定义视图的UIButton,然后从该按钮显示popover,但是如果我实际为showFromRect提供“居中”值,popover似乎会忽略它

这背后的代码非常简单:

- (void)viewDidLoad {
    [super viewDidLoad];

     UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"share"] style:UIBarButtonItemStylePlain target:self action:@selector(shareTap:)];

     self.navigationItem.rightBarButtonItem = button;
}

- (void)shareTap:(UIBarButtonItem *)button {
    self.popover = [[UIPopoverController alloc] initWithContentViewController:[[UIViewController alloc] init]];

    [self.popover presentPopoverFromBarButtonItem:button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
现在,如前所述,如果我切换到使用内部按钮,我会看到类似的行为(注意颜色的变化,这样图像就会显示出来)

这方面的代码仍然相当简单:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton *innerButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 22, 22)];
    [innerButton setImage:[UIImage imageNamed:@"share"] forState:UIControlStateNormal];
    [innerButton addTarget:self action:@selector(shareTap:) forControlEvents:UIControlEventTouchUpInside];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:innerButton];;
}

- (void)shareTap:(UIButton *)button {
    self.popover = [[UIPopoverController alloc] initWithContentViewController:[[UIViewController alloc] init]];

//    CGRect bottomCenter = CGRectMake(button.frame.size.width / 2, button.frame.size.height, 1, 1);
    CGRect bottomCenter = CGRectMake(2, button.frame.size.height, 1, 1);

    [self.popover presentPopoverFromRect:bottomCenter inView:button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
请注意,这里没有使用实际中心,而是使用了任意值2。如果使用1或0,则popover将左对齐。任何大于1的都将再次右对齐

我四处搜索了一下,寻找一个类似的问题,但似乎找不到有同样问题的人。任何关于是什么原因或如何避免的想法都将不胜感激。我能猜到的唯一一件事是,由于苹果离边缘很近,它会对巫毒进行一些定位,迫使它去他们想去的地方。问题是,右上角的按钮似乎是一个非常标准的下拉位置

编辑:我已经确认,长按本机邮件应用程序中的“新建邮件”图标时,也会发生同样的行为


编辑2:我能够与苹果确认这是一个问题。在一个较新的版本中(我不记得是哪个,我想是9中的一个),他们这样做是为了让你可以手动设置。我相信默认行为仍然是错误的(我已经有一段时间没有尝试过了),但是如果您愿意,您可以使用CGRect offset方法使其正常工作。

这里有一种方法可以做到这一点:与其使用
uibarbuttonsystemim
,不如使用带有自定义视图的
uibarbuttonim
。只需将
UIButton
拖动到
UINavigationBar
中,即可获得一个带有嵌入式
UIButton
UIBarButtonItem
,显示为
UIBarButtonItem
的自定义视图

@IBAction func didTapActionButton(_ sender: Any) {
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "myPopover") {
        vc.modalPresentationStyle = .popover
        guard let innerView = actionButton.customView else {
            // Unexpected missing custom view
            return
        }

        vc.popoverPresentationController?.sourceView = navigationController?.navigationBar
        vc.popoverPresentationController?.sourceRect = innerView.frame
        self.present(vc, animated: true, completion: nil)
    }
}

必须指定需要显示弹出窗口的条形按钮的框架

以下代码将
UIAlertController
显示为条形按钮的弹出框

    @IBOutlet weak var playerRightBarButton: UIBarButtonItem!

    extension UIBarButtonItem {
       var frame: CGRect? {
        guard let view = self.value(forKey: "view") as? UIView else {
          return nil
      }
      return view.frame
    }
  }

    let alert = UIAlertController(title: "", message: "Sample PopOver", 
    preferredStyle: .actionSheet)
    if alert.responds(to: #selector(getter: popoverPresentationController)) {
            alert.popoverPresentationController?.sourceView = self.view
            alert.popoverPresentationController?.barButtonItem = playerRightBarButton
            alert.popoverPresentationController?.permittedArrowDirections = .up
            if let frame = playerRightBarButton.frame {
                alert.popoverPresentationController?.sourceRect = frame
            }
        }
        self.present(alert, animated: true, completion: nil)

尝试此UIBarButtonItem*按钮=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAction目标:自我操作:@selector(shareTap:)];你能再解释一下吗?使用系统项本身并不能修复按钮的位置,在我的编辑中,我提到默认应用程序也会出现这个问题(邮件),可能是使用系统图标。我想你可能会注意到这是iOS 9之后修复的。我在文章的开头提到,甚至UIButton都不起作用,但后来(在一次编辑中)苹果对其进行了更新,以便您可以使用UIButton修复定位。我遇到了您最初在iOS 10上的一个项目中描述的弹出箭头偏移问题,这是对我的修复-我想你是说这种方法在存在bug的iOS 9上不起作用。我没有试过。我不完全确定,但我认为这与我的问题无关。这是如何处理箭头位置的?您指的是什么“框架”设置?您是说在uiBarButtonim类上添加扩展方法吗?扩展为您提供了barButton的框架。当我们设置需要显示popover的框架时,它会相应地居中。我提供了一个alertController在iPad中显示为popOver的示例。