SetNeedsDisplay в NSView запускает перерисовку всей иерархии представлений.
Я работаю над приложением, созданным NSWindow, которому принадлежит множество пользовательских подвидов, которые могут быть непрозрачными или нет. Всякий раз, когда я вызываю SetNeedsDisplay: или SetNeedsDisplayInRect: в подвиде, система вызывает drawRect каждого отдельного подвида, начиная с представления содержимого родительского NSWindows.
Как этого избежать? Как я могу перерисовать только грязное подвид (это должно быть поведение по умолчанию)? Есть ли что-то, что мне не хватает, возможно, в подклассе NSView? Или в настройке свойств или стиля родительского NSWindow?
Спасибо
2 ответа
Хорошо, я думаю, что понял это. Кажется, что превращение всех подпредставлений в представления с поддержкой слоев сделало свое дело. И это разумно, учитывая способ управления слоями графическим процессором и то, как выполняется композитинг слоев. Но я до сих пор не понимаю, почему, используя «классические» NSViews, независимо от того, непрозрачны они или нет, родственные или дочерние, перекрываются или нет, я не могу аннулировать одно представление без того, чтобы система вызывала перерисовку всего просмотреть иерархию окна
То , что может быть непрозрачным или нет , является проблемой. Любое непрозрачное представление вызывает перерисовку всей иерархии представлений, потому что окно должно восстановить фон этих представлений до исходного состояния. Только виды, установленные как непрозрачные, могут не требовать перерисовки чего-либо еще под ними. Однако они могут вызывать перерисовку «выше», если само непрозрачное представление частично закрыто другими представлениями.