使NSView NOT剪辑子视图超出其范围

Dru*_*erB 23 cocoa objective-c calayer nsview clip

是否有可能NSView 剪辑其超出边界的子视图?在iOS上,我只想设置clipsToBounds我的UIView号码NO.但是NSView没有这样的财产.我试图用试验wantsLayer,masksToBounds,wantsDefaultClipping,但所有这些似乎只改变的裁剪drawRect方法,而不是子视图.

Ava*_*rio 13

围绕这一点的行为似乎已经改变。您只需要将视图的图层设置为不屏蔽边界。

view.wantsLayer = true
view.layer?.masksToBounds = false
Run Code Online (Sandbox Code Playgroud)


Pad*_*van 8

经过5个小时的挣扎,我才刚刚实现.只需将.storyboard或.xib中的任何NSView的类更改为NoClippingView,它就不会剪切任何子视图.

class NoClippingLayer: CALayer {
    override var masksToBounds: Bool {
        set {

        }
        get {
            return false
        }
    }
}

class NoClippingView: OSView {
    override var wantsDefaultClipping: Bool {
        return false
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        wantsLayer = true
        layer = NoClippingLayer()
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我在NoClippingLayer中覆盖masksToBounds?因为一些本机AppKit类在运行时更改了所有子层的此属性而没有任何警告.例如,NSCollectionView为其单元格的视图执行此操作.


Dru*_*erB 7

我能够通过覆盖wantsDefaultClipping子视图来解决这个问题NO.

  • 用`NSButton`中的`NSTextField`测试它并没有用. (3认同)

Cha*_*ase 5

如果使用自动布局,则覆盖alignmentRectInsets以展开剪裁区域,使其大于对齐矩形.这个例子在所有方面都给出了50的空间:

override var alignmentRectInsets: NSEdgeInsets {
    return NSEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0)
}
Run Code Online (Sandbox Code Playgroud)