2015-06-13 3 views
2

программно Итак, я пытаюсь добавить некоторые взгляды (NSTextField в данном примере) в NSStackView:просмотров не будут правильно отображаться после добавления их NSStackView

я добавил экземпляр 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]); 

Текстовые поля помещаются в StackView, но они расположены в таком же положении, то есть второй перекрывает первый полностью. Я все еще могу выбрать сначала [пробел + табуляция].

Вот консольный вывод:

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)-| (Names: '|':NSStackViewContainer:0x6000001a0700)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d30 h=--& v=--& V:[NSTextField:0x608000183400]-(0)-| (Names: '|':NSStackViewContainer:0x6000001a0700)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d80 h=--& v=--& V:[NSTextField:0x608000183400(20)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000084bf0 V:[NSStackViewSpacer:0x6080001834d0(>=8)]> 

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens. And/or, break on objc_exception_throw to catch this in the debugger. 
2015-06-13 17:11:00.802 celty-test[62306:9217679] Unable to simultaneously satisfy constraints: 
(
    "<NSLayoutConstraint:0x608000084f10 V:[NSTextField:0x608000183330]-(0)-[NSStackViewSpacer:0x6080001834d0]>", 
    "<NSLayoutConstraint:0x608000085460 V:[NSStackViewSpacer:0x6080001834d0]-(0)-[NSTextField:0x608000183400]>", 
    "<NSAutoresizingMaskLayoutConstraint:0x608000084970 h=--& v=--& V:[NSTextField:0x608000183330]-(0)-| (Names: '|':NSStackViewContainer:0x6000001a0700)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d30 h=--& v=--& V:[NSTextField:0x608000183400]-(0)-| (Names: '|':NSStackViewContainer:0x6000001a0700)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d80 h=--& v=--& V:[NSTextField:0x608000183400(20)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000085460 V:[NSStackViewSpacer:0x6080001834d0]-(0)-[NSTextField:0x608000183400]> 

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens. And/or, break on objc_exception_throw to catch this in the debugger. 
2015-06-13 17:11:00.814 celty-test[62306:9217679] 20.000000 - 0 

XIB и результат скриншоты: XIB

result

Там нет никаких ограничений, загруженных в StackView. StackView должен быть вертикальным. В стеке будет добавлено динамическое количество текстовых полей.

+0

Существуют ли ограничения на виджетов? У вас есть гравитация, устанавливающая как текстовые поля в нижней части виджета, так и внешний вид вашего отладчика, например, у вас есть интервал между текстовыми полями, но они должны быть прикреплены к верхней части виджета, если вы хотите, чтобы изменяемый размер виджета. Подобно '' V: | [tf] -8- [tf2] | "' – Tim

+0

Нет ограничений, которые я добавил либо в ScrollView, либо в текстовые поля. – ShadowPrince

ответ

8

Вам необходимо установить для поля translatesAutoresizingMaskIntoConstraints значение текстовых полей в значение false.

Как правило, вы не должны делать этого, если представление помещается каким-либо другим кодом. То есть вы ожидаете, что представление стека решит, должно ли это свойство включаться или выключаться, потому что оно контролирует размещение его в иерархии представлений. Тем не менее, есть ошибка в NSStackView в отношении этого до 10.10, поэтому вам придется отключить это самостоятельно.

Ключ состоит в том, что набор неудовлетворительных ограничений включает в себя типы NSAutoresizingMaskLayoutConstraint.

+0

Благодарим вас. Только второй день в Какао и уже выявил ошибку. – ShadowPrince

+0

Похоже, что это исправлено на 10.11, с установкой 'NSStackView'' translatesAutoresizingMaskIntoConstraints' для добавленных просмотров в false. – Taylor

+0

Большое вам спасибо! Я просто потратил часы, пытаясь заставить это работать, и это исправило это. Как ни странно, у меня есть другое представление стека с той же настройкой, и он отлично работает, не делая этого ... – DanielGibbs

 Смежные вопросы

  • Нет связанных вопросов^_^