更改UIPopoverView背景+箭头颜色

时间:2014-08-20 11:12:50

标签: ios uiview swift ios8 uipopoverbackgroundview

有没有办法在iOS8上简单地更改UIPopoverView背景颜色(包括它的箭头)?

(我确实阅读了几篇关于自定义的文章" UIPopoverControllers"。这是否适用于此,意味着答案是"没有"?)

enter image description here

这不是我应该能够在触发弹出窗口的 prepareForSegue 方法中解决的问题吗?我怎样才能达到相应的视图来改变它的外观?

5 个答案:

答案 0 :(得分:55)

我找到了解决方案。使用iOS8不再需要子类化!可以在tableview中访问和更改背景 - >导航 - > popoverPresentationController

    self.navigationController?.popoverPresentationController?.backgroundColor = UIColor.redColor()

在WWDC会话214中有关此内容的更多信息。

答案 1 :(得分:8)

你可以像这样修改popover:

    let popoverViewController = self.storyboard?.instantiateViewControllerWithIdentifier("popoverSegue")
    popoverViewController!.popoverPresentationController?.delegate = self
    popoverViewController!.modalPresentationStyle = .Popover


    let popoverSize = CGSize(width: 150, height: 60)
    popoverViewController!.preferredContentSize = popoverSize
    let popover = popoverViewController!.popoverPresentationController
    popover?.delegate = self
    popover?.permittedArrowDirections = .Up
    popover?.sourceView = self.view

    //change background color with arrow too!
    popover?.backgroundColor = UIColor.whiteColor()
    popover?.sourceRect = CGRect(x: self.view.frame.width, y: -10, width: 0, height: 0)
    presentViewController(popoverViewController!, animated: true, completion: nil)

答案 2 :(得分:1)

似乎popoverPresentationController.backgroundColor不再在iOS13中工作。

弹出窗口箭头现在看起来像弹出窗口viewController的view.backgroundColor的颜色。

这是下面的演示的完整代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let sourceButton = sender as? UIButton, let popover = segue.destination.popoverPresentationController {
        popover.sourceView = sourceButton.superview
        popover.sourceRect = sourceButton.frame
        popover.permittedArrowDirections = [.left]
        popover.delegate = self
        segue.destination.preferredContentSize = CGSize(width: 100, height: 100)
        //popover.backgroundColor = sourceButton.tintColor  //old way
        segue.destination.view.backgroundColor = sourceButton.tintColor  //new way
    }
}

@IBAction func btnTap(_ sender: Any) {
    performSegue(withIdentifier: "popoverSegue", sender: sender)
}

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}

enter image description here

答案 3 :(得分:1)

SwiftUI:Xcode 11.5

添加带有颜色的.background修饰符并添加.edgesIgnoringSafeArea修饰符。

.popover(isPresented: self.$vm.presentMenu, content: {
        self.menuView
           .background(Color.bgGray.edgesIgnoringSafeArea(.all))
})

答案 4 :(得分:0)

只需添加一下,如果您是在UIPopover内使用SwiftUI或使用SwiftUI的popover修饰符,则只需在后台使用Color即可设置弹出框的背景颜色,就像在{ {1}}。

如果您希望箭头为彩色,则可以在背景颜色中添加ZStack修饰符,以便将其扩展到箭头中。

SwiftUI示例:

.edgesIgnoringSafeArea(.all)