NSScrollView包含NSStackView。为什么NSStackView项目从下到上?

时间:2016-07-31 03:13:02

标签: swift macos cocoa nsscrollview nsstackview

包含NSStackView的NSScrollView。 NSStackView的项目将在运行时添加。新的NSStackView项目从下到上,但我希望它们是从上到下。 enter image description here enter image description here

main.storyboard

enter image description here

ViewController

import Cocoa

class ViewController: NSViewController {

    var todoList:[Todo] = []

    @IBOutlet weak var todosStackView: NSStackView!
    @IBOutlet weak var todosScrollView: NSScrollView!

    @IBAction func onEnter(sender: NSTextField) {
        let todo = Todo()
        todo.content = sender.stringValue
        self.todoList.append(todo)

        let todoItemView = TodoItem()
        todoItemView.setButtonType(.SwitchButton)
        todoItemView.todo=todo
        todosStackView.addView(todoItemView, inGravity: .Top)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

复选框按钮类

import Cocoa

class TodoItem: NSButton {
    var todo:Todo!{
        didSet {
            self.title = self.todo.content
            self.state = self.todo.done ? NSOnState : NSOffState
        }
    }

    func completeTodo(){
        if(self.state == NSOnState){
            self.todo.done = true
        }else{
            self.todo.done = false
        }
    }

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

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        self.setButtonType(.SwitchButton)
        self.target = self
        self.action = #selector(self.completeTodo)
    }
}

2 个答案:

答案 0 :(得分:11)

默认情况下,NSClipViews(和基础NSView)不会被翻转,因此坐标(和滚动视图定位)相对于左下角。

您可以继承NSClipView并覆盖isFlipped以返回true。然后在IB中,将滚动视图的剪辑视图设置为该自定义类。

答案 1 :(得分:0)

您的视图(堆栈视图的父级)通过前导锚点和底部锚点锚定到父剪辑视图。尝试使用前导和顶部。注意:您的堆栈视图本身似乎已正确对齐。