MacアプリでNSViewから子Viewをはみだしたい
Macアプリ で NSView から子View をはみだしたいときの方法です。
https://gyazo.com/222fcfb5b0282f327adb0acc2fd463da
やりたいことはこんな↑感じで、 Show ボタンをクリックしたらサブメニュー的に NSTableView を表示することです。
https://gyazo.com/12b2815d14d68a05a8e2963e110c9583
しかし、テーブルビューはボタンとおなじ NavigationBarView の子どもなので、氷山のようにほとんどの部分が隠れてしまっています。
iOS では UIView の clipsToBounds プロパティを false にすることではみだすことができますが、Macアプリはもう少しややこしいようです。
参考記事:Make NSView NOT clip subviews outside of its bounds
まず、NSView を継承した NavigationBarView クラスを作成します。
つぎに、 wantsDefaultClipping をoverride して false を返します。
参考記事ではそれだけではみだすことができるような回答もありましたが、試したところうまくいきませんでした。そこで、もうひとつの回答にあったように、 CALayer で masksToBounds を override して false を返すようにしたらはみだすことができました。
code: Swift
import Cocoa
class NoClippingLayer: CALayer {
override var masksToBounds: Bool {
set {
}
get {
return false
}
}
}
class NavigationBarView: NSView {
override var wantsDefaultClipping: Bool {
return false
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
}
override func awakeFromNib() {
super.awakeFromNib()
wantsLayer = true
layer = NoClippingLayer()
}
}
はみだすのはうまくいきましたが、NSView の背景色をこの色に設定していたのに、
https://gyazo.com/94e943c18c1a8ed991089fd43995d43d
なぜかこんな色に変わってしまいました(文字が表示されているのは気にしないでください)。CALayer を書きかえたからでしょうか?
https://gyazo.com/2f59b15fababeab04ce2019a8800b166