2015-06-18 1 views
1

Я пытаюсь понять, как работают NSViews с поддержкой слоев. Я создал следующий код внутри игровой площадки.Подкласс NSView подклассов вызывает проблему z-index для своего супервизора, не поддерживаемого с помощью слоя

import Cocoa 
import XCPlayground 

class MyView: NSView { 

override init(frame: NSRect) { 
    super.init(frame: frame) 

    wantsLayer = true //if commented change centerX & centerY accordingly 
    layerContentsRedrawPolicy = .OnSetNeedsDisplay 
    layer!.backgroundColor = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 0.5) 
} 

required init?(coder: NSCoder) { 
    super.init(coder: coder) 
} 

} 

let containerView: NSView = NSView(frame: CGRectMake(0, 0, 150, 165)) 
let myView: MyView = MyView(frame: containerView.frame) 
let label: NSTextField = NSTextField(frame: NSRect(x: 0.0, y: 0.0, width: 100, height: 22)) 
label.stringValue = "Please wait..." 
label.drawsBackground = false 
label.bordered = false 
label.selectable = false 
label.textColor = NSColor.whiteColor() 

//containerView.addSubview(myView) 
containerView.addSubview(myView) 
containerView.addSubview(label, positioned: .Above, relativeTo: myView) 

XCPShowView("view", containerView) 

По существу, я создал подкласс NSView с поддержкой слоев. Затем я добавляю этот подкласс в контейнер с контейнером, не поддерживающий слой. Я также добавляю NSTextField в containerView, явно позиционируя его над подклассом NSView под псевдонимом.

Моя цель состоит в том, чтобы показать NSTextField над видом с поддержкой слоя. Тем не менее, в помощнике редактора изображение NSTextField появляется под видом с поддержкой слоя. Может кто-то, пожалуйста, помогите понять, почему это происходит?

ответ

1

После борьбы с проблемой довольно немного я смог узнать, что я должен был установить

label.wantsLayer = true 
label.layerContentsUpdatePolicy = .OnSetNeedsDisplay 

для Z-индекс, чтобы быть правильным. Я все еще не уверен, почему это так, поскольку метка не является частью иерархии представления MyView, а является частью более обширного контейнера, который не поддерживается на уровне слоев.