代码之家  ›  专栏  ›  技术社区  ›  Bernd

更改UIPopoverView背景+箭头颜色

  •  33
  • Bernd  · 技术社区  · 12 年前

    有没有办法 仅仅 更改iOS8上的UIPopoverView背景色(包括其箭头)?

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

    enter image description here

    这不是我应该在 准备Segue 触发弹出窗口的方法?我如何达到相应的视图以改变其外观?

    5 回复  |  直到 12 年前
        1
  •  60
  •   Satyam    6 年前

    我找到了解决方案。iOS8不再需要子类!可以从表视图中这样访问和更改背景->导航->弹出显示控件

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

    2014年WWDC会议中关于此的更多信息。

        2
  •  10
  •   Daniel Kuta    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)
    
        3
  •  4
  •   Travis M.    6 年前

    看起来popoverPresentationControllerbackgroundColor在iOS13中不再有效。

    弹出式箭头现在看起来与弹出式视图Controller的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

        4
  •  2
  •   Alexander    6 年前

    SwiftUI:Xcode 11.5

    添加 .background 修改器的颜色并添加 .edgesIgnoringSafeArea 修改器。

    .popover(isPresented: self.$vm.presentMenu, content: {
            self.menuView
               .background(Color.bgGray.edgesIgnoringSafeArea(.all))
    })
    
        5
  •  1
  •   Helam    6 年前

    只是补充一下,如果您在UIPopover中使用SwiftUI,或者如果您使用SwiftUI的popover修改器,您可以通过使用 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()
        }
    }
    
    推荐文章