NSWindow текстурированный фон с NStextField - PullRequest
3 голосов
/ 17 октября 2011

У меня супер странная проблема. Я хочу, чтобы текстурированное окно имело нормальный цвет градиента. У меня есть NSTextField в этом окне, текстовое поле предназначено для поля ввода URL, поэтому оно должно быть большим. Проблема в том, что когда он слишком велик (приблизительно больше 1/3 ширины окна), он просто переключает текстурированное окно, чтобы нарисовать более темную версию его градиента.

Вот пример проекта (очень простой ...) для тестирования.

http://raven.ipodtutofast.com/test.zip

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

Я действительно понятия не имею, как это исправить.

Обновление: благодаря cocoahero, если в настройке границы содержимого в IB вы выбираете пользовательский, вы можете просто установить высоту градиента так, как вам хочется, никогда раньше этого не замечали.

Ответы [ 2 ]

11 голосов
/ 17 октября 2011

Похоже, что это связано с настройкой Windows "Граница содержимого".Когда в IB установлено значение none, проблема не возникает, но также изменяет градиент.Похоже, ошибка для меня.Возможно время для радара?

4 голосов
/ 14 июля 2012

Я также столкнулся с проблемой градиента, отмеченной выше для текстурированных NSWindows, в моем приложении, но мне понадобилось много времени, чтобы найти этот пост, который помог решить эту проблему.

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

В моем случае я создал приложение с набором текстурированных окон.Как и в случае с Dimillian77, на фоновую текстуру основного окна моего приложения повлияли размеры и расположение подвидов, в моем случае это были различные подвиды NSView, которые NSWindowController главного окна переключает в зависимости от того, какая областьприложение, к которому обращается пользователь.Поскольку размеры и расположение подвидов NSView немного отличаются для каждого подвида, это соответственно делало ошибку градиента более очевидной, когда пользователи переключались между каждым видом, так как градиент фона основного окна прыгал бы позади подвида.

Интересно, что проблема с градиентом появилась только после перехода на OS X 10.7 Snow Leopard - тот же неизмененный исходный код и файлы .xib / .nib не привели к этой проблеме ни в каких более ранних версиях OS X.Казалось бы, он согласен с предположением Cocoahero о том, что эта проблема может быть новой ошибкой, достойной отчета радара - возможно, мы обнаружим, что она исправлена ​​в Mountain Lion?

Как это было, главное NSWindow моего приложения ивсе поддерживающие окна были настроены на использование «текстурированного» (металлического) фона, но только после перехода на Snow Leopard проявился градиент «жучка».

До нахождения этого поста единственный способ, которым янаткнулся на «решить» вопрос был в нотицинеЕсли бы в окне был включен элемент управления «Изменение размера», ошибка градиента исчезла!

Однако я не хотел, чтобы размер окна моего конкретного приложения изменялся, и настолько, насколько я мог отключить строку заголовка «Изменить размер»"управлять с помощью -(void)setShowsResizeIndicator:(BOOL)showResizeIndicator и отвергать попытки пользователя изменить размер окна путем перехвата вызовов на -(NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize, это явно не было элегантным решением или путем.Это решение не удалось, особенно из-за того, что окно все еще показывало свои курсоры мыши изменения размера (которые я не смог скрыть), так как они вводили пользователей в заблуждение, поскольку я отвергал любые попытки изменить размер окна в коде.

К счастьюРешение Cocoahero об изменении параметра «Граница содержимого» на «Нет» сразу же привело к исчезновению проблемы с градиентом в Интерфейсном Разработчике (версия, интегрированная с Xcode 4.3.3), но, по крайней мере, в моем случае, при первоначальной компиляции и запуске приложения.после внесения этого изменения приложение завершало работу сразу после загрузки .xib-файлов.В трассировке появилось следующее сообщение об ошибке: «setAutorecalculatesContentBorderThickness: forEdge: нельзя вызывать с NSMaxYEdge в нетекстурированном окне».

Я обнаружил, что для параметра «Граница содержимого» задано значение «Пользовательский» и настройкаграницы содержимого «Вверх» и «Вниз», равные «1», помогли решить проблему, хотя, как ни странно, после сохранения и компиляции приложения с настройкой «Пользовательский», я обнаружил в результате экспериментов, что затем смог изменить «Пользовательскую границу».msgstr "установите значение" Нет "и скомпилируйте приложение, чтобы оно работало нормально во второй компиляции.

Однако изменение «Границы содержимого» на что-либо, кроме «Авторазмер», привело к множеству ошибок «Недопустимая конфигурация: автоматическое размещение в Mac OS X до 10.7» в XCode, а также к ряду «Атрибут недоступен: Значения» кроме Autosize для свойства Top / Bottom Content Border в версиях Mac OS X до ошибок 10.6 "- все это связано со свойством" Content Border "(моя цель развертывания установлена ​​на OS X 10.6, а не 10.7). Таким образом, поиск другого решения для ошибки возобновился, что привело меня к решению, описанному ниже. Решение, которое я нашел, по крайней мере в OS X 10.7, состояло в том, чтобы установить «Границу содержимого» каждого текстурированного окна обратно на «Авторазмер» в Интерфейсном Разработчике и вместо этого переопределить настройки границы содержимого в коде (в моем случае, поместив этот код в каждый из классов NSWindowController моего текстурированного окна):

// windowDidLoad is called when the window has loaded but before it's displayed...
-(void)windowDidLoad
{
    // set the content border thickness to 0 for both the top and bottom window edges
    [[super window] setContentBorderThickness:0 forEdge:NSMaxYEdge]; // top border
    [[super window] setContentBorderThickness:0 forEdge:NSMinYEdge]; // bottom border

    // disable the auto-recalculation of the window's content border
    [[super window] setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
    [[super window] setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge];
}

Обратите внимание, что вы можете установить толщину верхней границы содержимого только в текстурированных окнах. Если вы попытаетесь установить ее либо через код, либо через конструктор интерфейса для других типов NSWindow, система выдаст исключение, что может привести к сбой приложения.

Согласно документам NSWindow: «В нетекстурированном окне вызов setContentBorderThickness: forEdge: передача NSMaxYEdge вызовет исключение. Это допустимо только для установки толщины границ содержимого верхнего края в текстурированном окне.»

Поскольку проблема с градиентом действительно является новой ошибкой в ​​рендеринге «текстурированных» окон в OS X 10.7, может быть целесообразно изменить любой код, который переопределяет границы содержимого, чтобы такой код выполнялся только в системах, работающих OS X 10.7 (и, возможно, будущие выпуски OS X, если проблема не устранена в Mountain Lion).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...