Добавление ограничений программно приводит к неожиданному поведению - PullRequest
0 голосов
/ 04 апреля 2019

Я играю с ограничениями, пытаюсь узнать, как они работают, и попытаться научиться создавать пользовательский интерфейс без IB, и я не получаю ожидаемых результатов.В приведенном ниже коде, если я закомментирую ограничения в конце, я вижу фиолетовый вид.Если я раскомментирую их, все, что я получу, это пустое окно, в котором я ожидаю, что вид будет прикреплен к левому краю верхнего края основного вида.

Я также пытался сделать то же самое со свойствами centerX и centerY, чтобы попытаться отцентрировать вид в середине окна, снова я получаю пустое окно, когда они активированы.

Любая помощь приветствуется!

import Cocoa

class ViewController : NSViewController {

override func loadView() {

    // NSMakeRect parameters do nothing?
    let view = NSView(frame: NSMakeRect(0,0,400,2000))
    view.wantsLayer = true
    view.layer?.borderWidth = 5
    view.layer?.borderColor = NSColor.gray.cgColor
    self.view = view
}

override func viewWillAppear() {

    super.viewWillAppear()

    // Do any additional setup after loading the view.
    createMasterView()
}



func makeView() -> NSView {
    let view = NSView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.setFrameSize(NSSize(width: 600, height: 100))
    view.wantsLayer = true
    view.heightAnchor.constraint(equalToConstant: 1000)
    return view
}

func createMasterView() {

    let mainView = self.view
    let headerView = makeView()

    headerView.layer?.backgroundColor = NSColor.purple.cgColor
    headerView.layer?.borderWidth = 5
    headerView.layer?.borderColor = CGColor.black

    mainView.translatesAutoresizingMaskIntoConstraints = false
    mainView.addSubview(headerView)

    headerView.topAnchor.constraint(equalTo: mainView.topAnchor).isActive = true
    headerView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor).isActive = true
    headerView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor).isActive = true
}  
}

Редактировать: я также включил мой код AppDelegate ниже.Я все еще очень новичок во всем этом, поэтому код - это то, что я собрал вместе из разных уроков.

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {

var windowController: NSWindowController!
var window: NSWindow!
var windowTitle = "Test App"
var customBGColor = NSColor(red: 1, green: 1, blue: 1, alpha: 1)

func applicationDidFinishLaunching(_ aNotification: Notification) {

    createMainWindow()
}  

func createMainWindow() {
    window = NSWindow()
    // window.alphaValue = 0.5
    window.backgroundColor = customBGColor
    window.title = windowTitle
    window.styleMask = NSWindow.StyleMask(rawValue: 0xf)
    window.backingType = .buffered
    window.contentViewController = ViewController()
    window.setFrame(NSRect(x: 700, y: 200, width: 1920, height: 1080), display: false)
    windowController = NSWindowController()
    windowController.contentViewController = window.contentViewController
    windowController.window = window
    windowController.showWindow(self)
}

func applicationWillTerminate(_ aNotification: Notification) {
    // Insert code here to tear down your application
}
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

При автоматическом размещении вы не затрагиваете свойство кадра представления. При работе программно, однако, вы должны работать с самим представлением, но после этого все подпредставления могут быть измерены и позиционированы с использованием ограничений. Для наглядности избавился от makeView():

func createMasterView() {

    let headerView = NSView() // instantiate
    headerView.layer?.backgroundColor = NSColor.purple.cgColor // style
    headerView.layer?.borderWidth = 5
    headerView.layer?.borderColor = CGColor.black
    headerView.translatesAutoresizingMaskIntoConstraints = false // disable mask translating
    view.addSubview(headerView) // add as a subview

    // then configure constraints

    // one possible setup
    headerView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    headerView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    headerView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    headerView.heightAnchor.constraint(equalToConstant: 100).isActive = true

    // another possible setup
    headerView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    headerView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    headerView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    headerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.5).isActive = true

    // another possible setup
    headerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    headerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    headerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -50).isActive = true
    headerView.heightAnchor.constraint(equalTo: view.heightAnchor, constant: -50).isActive = true

}
0 голосов
/ 04 апреля 2019

view.setFrameSize (NSSize (ширина: 600, высота: 100))

Вскоре после этого вы переопределяете высоту с помощью якоря высоты. Попробуйте также установить ширину с помощью якоря

...