Построение области клипа в UIView из объектов пути в его подпредставлениях - PullRequest
0 голосов
/ 20 апреля 2010

Я пытаюсь создать область отсечения в UIView, которая генерируется из объектов пути в его подпредставлениях. Например, у меня может быть одно подпредставление, содержащее квадрат, а другое - круг. Я хочу иметь возможность создать клип в родительском суперпредставлении, которое является объединением обеих этих форм. Может кто-нибудь объяснить, как это сделать? Все, что мне удалось выяснить, это:

1 - drawRect: метод суперпредставления вызывается до того, как drawRects его подвидов,
2 - ContextRef, который доступен во всех трех экземплярах, одинаков.

Кроме этого я в тупике. Спасибо,
Говард

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

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

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState( context );
CGContextBeginPath( context );

for ( view in subviews ) {
  if ( [view respondsToSelector:@selector(pathTranslatedForView:)] ) {
    CGContextAddPath( context , [(MyCustomViewPath *)view pathTranslatedForView:self] );
  }
}

CGContextClip( context );
// do stuff with clipping path
CGContextRestoreGState( context );

Edit:

При вызове подпредставления вы можете настроить контекст таким образом, чтобы 0,0 было источником вызываемого представления, а не суперпредставлением:

CGRect frame = [view frame];
CGContextTranslateCTM( context , -frame.origin.x , -frame.origin.y );
CGContextAddPath( context , [(MyCustomViewPath *)view path]; 
CGContextTranslateCTM( context , frame.origin.x , frame.origin.y );
0 голосов
/ 21 января 2019

Может быть, попытаться установить цвет фона на .clear: исчезнет UIView - Прямоугольник Лизинг только форма пути

...