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

main.storyboard
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.
}
}
}
Run Code Online (Sandbox Code Playgroud)
复选框按钮类
import …Run Code Online (Sandbox Code Playgroud) 我有一个NSStackView以编程方式创建,并向其中添加了一个NSButton。
NSStackView *stackView = [[NSStackView alloc] initWithFrame:rect];
stackView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable;
stackView.alignment = NSLayoutAttributeBaseline;
(...)
NSButton *button = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, 40, 50)];
button.image = item.image;
button.title = item.name;
button.bordered = NO;
button.imagePosition = NSImageAbove;
button.translatesAutoresizingMaskIntoConstraints = NO;
(...)
[stackView addView:button inGravity:NSStackViewGravityLeading];
Run Code Online (Sandbox Code Playgroud)
我期望这已经足够,因为按钮具有固有的内容大小(我检查了它是否返回了适当的值)。
检查视图层次结构,我可以看到按钮框是origin =(x = 0,y = 0)size =(width = 40,height = 50),其超级视图(NSStackViewContainer的一个实例)是origin = {x = 0 ,y = 0)size =(width = 0,height = 0),而NSStackView是origin =(x = 0,y = 0)size =(width = 400,height = 50)。
如您所见,NSStackViewContainer的宽度和高度为0 ...
如果我在按钮上添加了宽度和高度限制,则一切正常。为什么按钮的internalContentSize不够?
所以,我正在尝试向NSStackView添加一些视图(在此示例中为NSTextField):
我已将NSStackView实例添加到XIB文件中,并将其作为小部件链接到文档中.在... didLoadNib我这样做:
NSTextField *tf = [[NSTextField alloc] init];
tf.stringValue = @"124";
[tf setFrameSize:NSMakeSize(100, 20)];
[widgets addView:tf inGravity:NSStackViewGravityLeading];
NSLog(@"%f - %d", NSHeight(tf.frame), [tf hasAmbiguousLayout]);
NSTextField *tf2 = [[NSTextField alloc] init];
tf2.stringValue = @"123";
[tf2 setFrameSize:NSMakeSize(100, 20)];
[widgets addView:tf2 inGravity:NSStackViewGravityLeading];
NSLog(@"%f - %d", NSHeight(tf2.frame), [tf2 hasAmbiguousLayout]);
Run Code Online (Sandbox Code Playgroud)
TextFields被放置在StackView中,但是它们被放置在相同的位置,即第二个完全重叠.我仍然可以先通过[space + tab]选择.
这是控制台输出:
2015-06-13 17:11:00.736 celty-test[62306:9217679] 20.000000 - 1
2015-06-13 17:11:00.739 celty-test[62306:9217679] Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x608000084bf0 V:[NSStackViewSpacer:0x6080001834d0(>=8)]>",
"<NSLayoutConstraint:0x608000084f10 V:[NSTextField:0x608000183330]-(0)-[NSStackViewSpacer:0x6080001834d0]>",
"<NSLayoutConstraint:0x608000085460 V:[NSStackViewSpacer:0x6080001834d0]-(0)-[NSTextField:0x608000183400]>",
"<NSAutoresizingMaskLayoutConstraint:0x608000084970 h=--& v=--& V:[NSTextField:0x608000183330]-(0)-| …Run Code Online (Sandbox Code Playgroud) 是否可以通过拖动子视图来更改NSStackView中视图的顺序,就像我们在NSTableView中所做的一样?
cocoa ×5
nsstackview ×5
autolayout ×2
macos ×2
nsscrollview ×1
nsview ×1
objective-c ×1
swift ×1