Содержимое заполнения NSPopover с одной стороны

У меня есть два NSPopovers, оба настроены одинаково (просто связывание пользовательского NSView из IB). Оба всплывают нормально, но один, кажется, смещает содержимое примерно на 20 пикселей.

Этот NSPopover (правильно) не дополняет содержимое...

без заполнения

но этот добавляет около 20 пикселей со стороны езды.

padding

Вот два представления, выложенные в IB

введите здесь описание изображения

Как видите, панель поиска должна быть закреплена справа, как слева, но почему-то это не так. Сначала я подумал, что это проблема с ограничениями, но, повозившись с ними некоторое время, я могу подтвердить, что это не так.

Любая подсказка, что случилось?

РЕДАКТИРОВАТЬ: Решил создать подкласс представления и заполнить его прямоугольник, получил очень странные результаты! Вид кажется смещенным. Я понятия не имею, почему это...

введите здесь описание изображениявведите здесь описание изображения


person Atlas Wegman    schedule 14.05.2013    source источник
comment
У меня нет для вас ответа, но комментарий appears to be padding the content on one side by about 20px., похоже, вводит в заблуждение. Панель поиска на снимке экрана приложения имеет точно такую ​​же ширину, что и на снимке экрана nib. Это говорит о том, что проблема в том, что он вообще не изменяет размер, а не в том, что там есть правое поле.   -  person Steve Waddicor    schedule 14.05.2013
comment
Да, это было мое первоначальное предположение, но после небольшого теста я вижу, что оно действительно неверно. Теперь кажется, что представление контента смещено примерно на 20 пикселей...   -  person Atlas Wegman    schedule 14.05.2013
comment
Добавьте ведение журнала в метод setFrame: класса пользовательского представления содержимого, а также зарегистрируйте кадр superview, пока вы на нем.   -  person trojanfoe    schedule 14.05.2013
comment
@trojanfoe хорошая идея. Из этого теста видно, что правильный вид установлен на кадр x: 13 y: 13, а неправильный установлен на x: 0 y: 0 Время копать глубже!   -  person Atlas Wegman    schedule 14.05.2013
comment
Ладно проблема решена! Я переопределил свойство setFrame и заставил его изменить свои x и y на 13, 13. Вызов setFrame после этой начальной точки не имеет никакого эффекта, что делает переопределение необходимым. Спасибо всем!   -  person Atlas Wegman    schedule 14.05.2013
comment
Еще одна вещь, которую следует упомянуть; если вы создаете NSViewController из NIB, убедитесь, что владелец файлаNSViewController, а view настроен на правильное представление в NIB. Это подразумевает одно представление на кончик, чего у вас нет.   -  person trojanfoe    schedule 14.05.2013


Ответы (3)


Из здесь это привлекло мое внимание (выделение мое ):

Принципиальное обстоятельство, при котором вам не следует вызывать setTranslatesAutoresizingMaskIntoConstraints:, — это когда вы не являетесь лицом, определяющим отношение представления к его контейнеру. Например, экземпляр NSTableRowView помещается NSTableView. Он может сделать это, разрешив преобразование маски автоматического изменения размера в ограничения, а может и нет. Это частная деталь реализации. Другие представления, для которых не следует вызывать setTranslatesAutoresizingMaskIntoConstraints:, включают NSTableCellView, подпредставление NSSplitView, представление NSTabViewItem или представление содержимого NSPopover, NSWindow или NSBox. Для тех, кто знаком с классическим макетом Cocoa: если вы не будете вызывать setAutoresizingMask: для представления в классическом стиле, вы не должны вызывать setTranslatesAutoresizingMaskIntoConstraints: при автомакете.

Это относится к вам?

person trojanfoe    schedule 14.05.2013
comment
Хм, я никогда не вызываю этот метод напрямую, и я безрезультатно пытался отключить автомакет. У меня такое ощущение, что это связано с тем, что представление contentViewControllers не заполняет все пространство. - person Atlas Wegman; 14.05.2013
comment
@AtlasWegman Итак, вы используете Autolayout (ограничения) или нет (пружины и стойки)? - person trojanfoe; 14.05.2013
comment
Я пробовал оба, ни один не работал. Вот мой макет пружины и стойки cl.ly/OxvC, который должен был расширить поле поиска, чтобы заполнить весь NSPopover. но он остался таким же, как на изображении выше - person Atlas Wegman; 14.05.2013
comment
@AtlasWegman А как насчет самого фактического просмотра контента? В моем собственном использовании всплывающих окон я устанавливаю размер своего представления следующим образом (я не использую ограничения, если это имеет значение): dl.dropboxusercontent.com/u/18450868/ - person trojanfoe; 14.05.2013
comment
Только что попробовал, не повезло. Хорошая идея, однако! - person Atlas Wegman; 14.05.2013
comment
@AtlasWegman Я не понимаю, почему это не работает ... если представление содержимого имеет настроенный размер, то размеры его подпредставления не должны иметь значения. Всплывающее окно должно использовать атрибуты размера, установленные в представлении. Хм. - person trojanfoe; 14.05.2013
comment
Взгляните на мое последнее редактирование, оно показывает довольно странное поведение! - person Atlas Wegman; 14.05.2013

если у вас есть выход для просмотра контента, вы сможете принудительно установить его с помощью:

[contentView setFrame:[[contentView superview]bounds]];

или более современно, я думаю...

contentView.frame = contentView.superview.bounds;
person Grady Player    schedule 14.05.2013
comment
По какой-то причине вызов метода setFrame после первоначального вызова не имеет никакого эффекта. В результате я создал подкласс NSView и переопределил метод setFrame, заставив его x, y равным 13, 13. Спасибо за ответ! - person Atlas Wegman; 14.05.2013

Задача решена, но я до сих пор точно не знаю, зачем ее нужно было решать. Представление содержимого NSPopovers (или, по крайней мере, мое) требует исходной точки X: 13, Y: 13. По какой-то причине только одно из моих представлений получало это значение.

Чтобы решить эту проблему, я создал подкласс NSView и переопределил метод setFrame, заставив его x и y всегда быть 13, 13.

-(void)setFrame:(NSRect)frameRect {
    [super setFrame:NSMakeRect(13, 13, frameRect.size.width, frameRect.size.height)];
}
person Atlas Wegman    schedule 14.05.2013
comment
Это не звучит как ответ для меня. Добавление угаданных магических чисел не является профессиональным программированием. Что здесь действительно не так, что означает, что вам нужны эти значения 13? - person Steve Waddicor; 14.05.2013
comment
Вы правы, это не ответ на ПРОБЛЕМУ, а скорее решение МОЕЙ проблемы. Я продолжу изучать это и редактировать, если найду что-нибудь, но я подумал, что добавление вышеизложенного в качестве ответа поможет любым будущим посетителям углубиться в корень своей проблемы. - person Atlas Wegman; 14.05.2013