【问题标题】:Change UIPopoverView background + arrow color更改 UIPopoverView 背景 + 箭头颜色
【发布时间】:2014-10-13 17:23:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios uiview swift ios8 uipopoverbackgroundview


    【解决方案1】:

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

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

    在 2014 年 WWDC 会议上了解更多信息。

    【讨论】:

    • 我将此添加到调用弹出框的控制器的 viewDidLoad 中,但没有任何反应。这应该去哪里?
    • @TravisM。 popoverPresentationController 那时不可用。改用“viewWillAppear”。
    • @Matthew,我确实尝试过,但它不起作用。不过,我可以在同一个地方设置sourceRectsourceView
    • 如果您的弹出框没有导航控制器,请使用self.popoverPresentationController?.backgroundColor = UIColor.red
    • 这不会改变箭头颜色
    【解决方案2】:

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

        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】:

      似乎 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
      }
      

      【讨论】:

        【解决方案4】:

        如果您在 UIPopover 中使用 SwiftUI,或者如果您使用 SwiftUI 的弹出框修饰符,您只需在背景中使用 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()
            }
        }
        

        【讨论】:

          【解决方案5】:

          SwiftUI:Xcode 11.5

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

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

          【讨论】:

            猜你喜欢
            • 2021-07-31
            • 2015-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多