Как установить порядок отображения в Objective-C - PullRequest
1 голос
/ 08 июня 2009

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

Как я это реализовал:

  1. Установка UIImage в UIImageView и добавление UIImageView в качестве подпредставления основного представления.
  2. Затем я использую drawRect (функция обновления рисования), чтобы нарисовать путь, используя функцию CIKContextStrokePath UIKit.

Теперь, кроме непосредственного использования функции рисования изображения контекста (я хочу избежать этого, поскольку я повторно использую свои ресурсы изображения в нескольких UIImageViews), есть ли способ правильно установить порядок (возможно, установлен флаг)?

Проблема снова заключается в том, что линии / путь рисуются перед UIImageViews (которые рисуются автоматически через соединение с родительским UIView), следовательно, они не видны над изображениями / UIImageViews.

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 июня 2009

Вы можете попробовать реализовать это через Quartz Core, используя слои (см. Документацию по классу CALayer). По сути, вы можете иметь иерархии слоев. Вы связываете каждый UIView с другим слоем, затем слои визуализируются вместе, образуя один составной слой. Кроме того, вы также можете применять преобразования и анимацию к слоям.

Вам нужно импортировать заголовок QuartzCore и сделать что-то вроде

#import <QuartzCore/QuartzCore.h>
UIView *mainView = [[UIView alloc] initWithFrame...
UIImageView *imageView = ...

CaLayer *mainViewLayer = mainView.layer;
[mainViewLayer addSubLayer: imageView.layer];

Затем, когда mainView появляется на экране, все подслои объединяются и отображаются на экране. То, что происходит, - то, что каждое представление рендерит свой слой, в то время как mainViewLayer рендерится, объединяя два слоя.

Дайте мне знать, если это работает для вас.

Вы можете иметь столько слоев, сколько захотите. Вы можете создать произвольную иерархию, используя методы CALayer

– addSublayer: 
– removeFromSuperlayer
– insertSublayer:atIndex:
– insertSublayer:below:
– insertSublayer:above:
– replaceSublayer:with:
3 голосов
/ 08 июня 2009

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

Вы должны рисовать в новом виде, который вы добавляете в основной вид, только после добавления UIImageView.

Вы также можете использовать bringSubviewToFront: и sendSubviewToBack: для ручного изменения порядка просмотра, если вам нужно.

(Из вашего поста непонятно, в какое представление вы рисуете, но я предполагаю, что вы включаете это основное родительское представление, которое объясняет это поведение.)

...