неправильное положение NSTextField в NSScrollView при изменении его размера

У меня есть простой NSScrollView созданный из IB. Я связал его с моим файлом .h, который является IBOutlet:

IBOutlet NSScrollView *scroller;

В моем .m я программно вставляю NSTextField вот так:

NSTextField *dateTextField = [[NSTextField alloc]initWithFrame:NSMakeRect(30,yPos - kBreakHeight - 15, 100, kBreakHeight)];
[dateTextField setBordered:NO];
[dateTextField setEditable:NO];
[dateTextField setBackgroundColor:[NSColor clearColor]];
[dateTextField setAlignment:NSLeftTextAlignment];
[dateTextField setFont:[NSFont fontWithName:kAppFontBold size:11]];
[dateTextField setTextColor:[NSColor colorWithCalibratedRed:33/255.0 green:33/255.0 blue:33/255.0 alpha:1]];
[dateTextField setStringValue:dateString];
[[scroller documentView] addSubview:dateTextField];

к сожалению, в первый обед моего представления текстовое поле находится не в правильном положении (но другие элементы в documentView да), и положение правильное, только если я изменяю размер окна.

Любая идея, как иметь правильную позицию при запуске?


person user1458963    schedule 15.06.2012    source источник


Ответы (2)


Вы не указываете, на какую версию OS X вы ориентируетесь, и если это Lion, используете ли вы автоматическую компоновку или традиционные пружины и стойки.

Если вы используете пружины и распорки (маски автоматического изменения размера), вам следует просто установить рамку в текстовом поле до или после ее добавления.

Если вы используете автоматическую компоновку, вам придется добавить соответствующие ограничения после добавления поля. О, и не забудьте установить для свойства translatesAutoresizingMaskIntoConstraints текстового поля значение NO, прежде чем добавлять его, иначе оно добавит свои собственные ограничения, которые будут мешать добавленным вами. По моему опыту, гораздо лучше добавить свои собственные явные ограничения, чем полагаться на автоматически сгенерированные.

Здесь есть несколько хороших документов по ограничениям макета:

https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/Introduction.html

http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/_index.html#//apple_ref/doc/uid/TP40010631

И прошлогодняя сессия WWDC действительно помогает понять это (требуется пароль):

https://developer.apple.com/videos/wwdc/2011/?id=103

person Monolo    schedule 17.06.2012
comment
к сожалению, я не использую свойство автоматического макета... значит, другие представления расположены правильно? Это потому, что это происходит из компонентов IB? Для информации, я работаю над выпуском Lion. - person user1458963; 17.06.2012

Я нашел решение, просто добавьте...:

[dateTextField setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable | NSViewMaxXMargin | NSViewMaxYMargin | NSViewMinXMargin | NSViewMinYMargin];
person user1458963    schedule 18.06.2012