web-dev-qa-db-ja.com

UIPopoverViewの背景と矢印の色を変更する

IOS8でUIPopoverViewの背景色(矢印を含む)を簡単に変更する方法はありますか?

(「UIPopoverControllers」のカスタマイズに関するいくつかの記事を読みました。これはここでも当てはまります。つまり、答えは「いいえ」ですか?)

enter image description here

これは、ポップオーバーをトリガーするprepareForSegueメソッドで対処できるものではありませんか?対応するビューにアクセスして外観を変更するにはどうすればよいですか?

31
Bernd

私は解決策を見つけました。 iOS8ではサブクラス化は不要になりました。背景は、tableview->ナビゲーション-> popoverPresentationController内からこのようにアクセスおよび変更できます。

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

この詳細については、WWDCセッション214を参照してください。

56
Bernd

次のようにポップオーバーを変更するだけです。

    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)
10
Daniel Kuta

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()
    }
}
0
Helam