Странное поведение drawRect: переопределение NSView?

#objective-c #cocoa #interface-builder #nsview

#objective-c #cocoa #конструктор интерфейса #nsview

Вопрос:

Приветствую всех,

Прежде всего, спасибо вам всем за то, что помогли мне с моими предыдущими вопросами.

Я вижу странное поведение при переопределении drawRect: для NSView. У меня есть очень простой подкласс NSView (RoundedView), который переопределяет только drawRect. Я установил для класса пользовательского представления значение RoudedView в interface builder. Внутри этого представления у меня есть метка. drawRect: вызывается правильно, как и ожидалось, но, к моему удивлению, RoundedView drawRect: также вызывается для метки внутри этого представления. Это приводит к тому, что drawRect рисует прямоугольник для метки, который был предназначен только для пользовательского представления, а не для каких-либо других элементов в этом представлении. В результате rect для метки неверен. Пользовательский вид находится внутри окна, для маски стилей которого установлено значение NSBorderlessWindowMask.

Это правильное поведение? Как мне предотвратить вызов drawRect для элементов, которые являются частью представления?

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

Спасибо,

Роберт

Ответ №1:

Не ожидайте, что прямоугольник, переданный drawRect: , всегда будет границами вашего представления. NSView способен перерисовывать только те части самого себя, которые нуждаются в перерисовке (следовательно, вызывается параметр dirtyRect ). В этом случае метка перекрывает содержимое вашего представления, поэтому всякий раз, когда она перерисовывается, системе просмотра также необходимо перерисовать представление за ней (ваше).

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

Комментарии:

1. Спасибо omz. Это было очень полезно. Мой взгляд очень прост, поэтому я выбрал NSRect bgRect = [self bounds]; вместо того, чтобы использовать dirtyRect, который передается в drawRect:

2. Спасибо @omz! Я только что потерял несколько часов из-за этой проблемы, и ваш ответ исправил ее.