Как получить кнопку, которая проецируется за пределы NSView? - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу реализовать кнопку, которая проецируется за пределы NSView. Аналогичная кнопка показана на изображении ниже.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если у вас должен быть вид, переполняющий окно, вы не можете сделать это, используя свойство masksToBound CALayer.Вам нужно использовать дочернее окно без полей и правильно его расположить.

Вот пример (в ObjC):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application


    NSRect windowFrame = self.window.frame;
    NSRect childWindowFrame = {
        .origin.x = CGRectGetMidX(windowFrame) - 25,
        .origin.y = CGRectGetMinY(windowFrame) - 25,
        .size.width = 50,
        .size.height = 50,
    };

    NSWindow *childWindow = [[NSWindow alloc] initWithContentRect:childWindowFrame
                                                        styleMask:NSWindowStyleMaskBorderless
                                                          backing:NSBackingStoreBuffered
                                                            defer:YES];
    childWindow.backgroundColor = [NSColor clearColor];
    childWindow.contentView.wantsLayer = YES;
    childWindow.contentView.layer.backgroundColor = [NSColor redColor].CGColor;
    childWindow.contentView.layer.cornerRadius = 25.0;



    [self.window addChildWindow:childWindow ordered:NSWindowAbove];
}

Красный кружок на этом скриншоте - это дочернее окно.

overflowing child window

0 голосов
/ 09 сентября 2018

Вы можете сделать это, убедившись, что ваш родительский вид поддерживается слоем, и установите для свойства masksToBounds его слоя значение false.

Вот игровая площадка AppKit, показывающая это в действии:

//: A Cocoa based Playground to present user interface

import AppKit
import PlaygroundSupport

let nibFile = NSNib.Name("MyView")
var topLevelObjects : NSArray?

Bundle.main.loadNibNamed(nibFile, owner:nil, topLevelObjects: &topLevelObjects)
let views = (topLevelObjects as! Array<Any>).filter { $0 is NSView }

let rootView = views.first as! NSView

// create parent
let parentView = NSView()
rootView.addSubview(parentView)
parentView.wantsLayer = true
parentView.layer?.masksToBounds = false
parentView.layer?.backgroundColor = NSColor.red.cgColor
parentView.translatesAutoresizingMaskIntoConstraints = false
parentView.centerXAnchor.constraint(equalTo: rootView.centerXAnchor).isActive = true
parentView.centerYAnchor.constraint(equalTo: rootView.centerYAnchor).isActive = true
parentView.widthAnchor.constraint(equalToConstant: 200).isActive = true
parentView.heightAnchor.constraint(equalToConstant: 200).isActive = true

let childView = NSView()
parentView.addSubview(childView)
childView.wantsLayer = true
childView.layer?.backgroundColor = NSColor.green.cgColor
childView.translatesAutoresizingMaskIntoConstraints = false
childView.centerXAnchor.constraint(equalTo: parentView.leadingAnchor).isActive = true
childView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true
childView.widthAnchor.constraint(equalToConstant: 100).isActive = true
childView.heightAnchor.constraint(equalToConstant: 100).isActive = true


// Present the view in Playground
PlaygroundPage.current.liveView = views[0] as! NSView

Это будет рисовать:

enter image description here

Зеленый вид - дочерний элемент красного взгляда.

...