NSPopover
三角形の部分を含めて背景色を変更するにはどうすればよいですか?
8 に答える
実際にははるかに簡単で、プライベート API は必要ありません。
ビュー コントローラーのルート ビューをカスタム クラスにする
@implementation MyPopoverRootView
-(void)viewDidMoveToWindow
{
NSView * aFrameView = [[self.window contentView] superview];
MyPopoverBackgroundView * aBGView =[[MyPopoverBackgroundView alloc] initWithFrame:aFrameView.bounds];
aBGView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
[aFrameView addSubview:aBGView positioned:NSWindowBelow relativeTo:aFrameView];
[super viewDidMoveToWindow];
}
@end
背景ビューは、その境界に目的の色を描画するだけです。
@implementation MyPopoverBackgroundView
-(void)drawRect:(NSRect)dirtyRect
{
[[NSColor whiteColor] set];
NSRectFill(self.bounds);
}
@end
スイフト3
override func viewDidMoveToWindow() {
guard let frameView = window?.contentView?.superview else {
return
}
let backgroundView = NSView(frame: frameView.bounds)
backgroundView.wantsLayer = true
backgroundView.layer?.backgroundColor = .white // colour of your choice
backgroundView.autoresizingMask = [.viewWidthSizable, .viewHeightSizable]
frameView.addSubview(backgroundView, positioned: .below, relativeTo: frameView)
}
ポップオーバーの背景色 (三角形/矢印を含む) のみを変更したい場合は、NSView のサブクラスを作成する必要はないと考えました。背景色のあるレイヤーでサポートされた NSView で十分です。
super.viewDidMoveToWindow()
また、デフォルトの実装では何もしないため、呼び出す必要はありません。
Stefanf のおかげで、これが機能しました。View コードの Swift バージョンを次に示します。前述のように、これは NSPopOver contentView として設定されたビューのクラスである必要があります。
class PopoverContentView:NSView {
var backgroundView:PopoverBackgroundView?
override func viewDidMoveToWindow() {
super.viewDidMoveToWindow()
if let frameView = self.window?.contentView?.superview {
if backgroundView == nil {
backgroundView = PopoverBackgroundView(frame: frameView.bounds)
backgroundView!.autoresizingMask = NSAutoresizingMaskOptions([.ViewWidthSizable, .ViewHeightSizable]);
frameView.addSubview(backgroundView!, positioned: NSWindowOrderingMode.Below, relativeTo: frameView)
}
}
}
}
class PopoverBackgroundView:NSView {
override func drawRect(dirtyRect: NSRect) {
NSColor.redColor().set()
NSRectFill(self.bounds)
}
}
私は同じ問題に直面しましたが、サードパーティの UI 要素を自分のプロジェクトに追加することを避けようとしているので、さらに調べました。次のような色を設定してdrawRect:
、ポップオーバーのビューでオーバーライドすると思われます。contentViewController
[[NSColor whiteColor] setFill];
NSRectFill([self bounds]);
次に、相対する四角形に接続する三角形/矢印を除いて、白い背景のポップオーバーが表示されます。それを解決するには、たまたま矢印が含まれているポップオーバーの境界ビューにアクセスする必要があります。
NSView* borderView = [self.view.window valueForKeyPath:@"_borderView"];
プライベート API であることは承知していますが、アプリを App Store に提出することが目的でない場合は、これが最も簡単な方法です。drawRect:
これで、このビューの もオーバーライドできます。SDK の更新でプライベート_borderView
プロパティの名前が変更されるなどの問題を回避するために、borderView を参照する前にその存在をアサートすることをお勧めします。
NSAssert(borderView, @"_borderView does not exist");
残念ながら、これは実際には不可能です。NSPopover は、カスタマイズできるように設計されていません。完全にカスタマイズされた外観が必要な場合は、おそらく INPopoverController のようなサードパーティのオープンソース NSPopover の代替品を使用するのが最善の策です。