33

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

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

在此处输入图像描述

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

4

5 回答 5

60

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

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

在 WWDC session 2014 中了解更多信息。

于 2014-09-10T22:23:23.600 回答
10

您可以像这样简单地修改弹出框:

    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)
于 2016-06-01T09:08:21.073 回答
3

似乎 popoverPresentationController.backgroundColor 不再适用于 iOS13。

弹出框箭头现在似乎呈现弹出框视图控制器的 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
}

在此处输入图像描述

于 2019-12-13T16:55:11.907 回答
2

SwiftUI:Xcode 11.5

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

.popover(isPresented: self.$vm.presentMenu, content: {
        self.menuView
           .background(Color.bgGray.edgesIgnoringSafeArea(.all))
})
于 2020-07-02T14:30:54.767 回答
1

只需添加一点,如果您在 UIPopover 中使用 SwiftUI,或者如果您使用 SwiftUI 的 popover 修饰符,您可以通过在背景中使用 a 来设置弹出框的背景颜色Color,就像在ZStack.

如果您希望箭头着色,您可以将.edgesIgnoringSafeArea(.all)修饰符添加到背景中的颜色,使其延伸到箭头中。

SwiftUI 示例:

import SwiftUI

struct PopoverTest: View {
    @State var showing: Bool = true
    var body: some View {
        Button("Show") {
            self.showing.toggle()
        }
        .popover(isPresented: $showing) {
            ZStack {
                Color.green.edgesIgnoringSafeArea(.all) // will color background and arrow
                Text("Popover!")
            }
        }
    }
}

struct PopoverTest_Previews: PreviewProvider {
    static var previews: some View {
        PopoverTest()
    }
}
于 2020-02-28T18:17:35.150 回答