Как визуализировать UIView в CGContext

Я хотел отобразить UIView в CGContextRef

-(void)methodName:(CGContextRef)ctx {
    UIView *someView = [[UIView alloc] init];

    MagicalFunction(ctx, someView);
}

Таким образом, MagicalFunction здесь должна отображать UIView (может быть его слой) в текущем контексте.

Как мне это сделать?

Заранее спасибо!


person SPatil    schedule 18.02.2011    source источник


Ответы (1)


Как насчет метода renderInContext для CALayer?

-(void)methodName:(CGContextRef)ctx {
    UIView *someView = [[UIView alloc] init];
    [someView.layer renderInContext:ctx];
}

EDIT: Как отмечено в комментарии, из-за разницы в происхождении двух систем координат, участвующих в процессе, слой будет отображаться в перевернутом виде. Чтобы компенсировать это, вам просто нужно перевернуть контекст по вертикали. Технически это делается с помощью преобразования масштаба и переноса, которые можно объединить в одно матричное преобразование:

-(void)methodName:(CGContextRef)ctx {
    UIView *someView = [[UIView alloc] init];
    CGAffineTransform verticalFlip = CGAffineTransformMake(1, 0, 0, -1, 0, someView.frame.size.height);
    CGContextConcatCTM(ctx, verticalFlip);
    [someView.layer renderInContext:ctx];
}
person Matt Wilding    schedule 19.02.2011
comment
Спасибо, это сработало! Но виды перевернуты! Какие-либо предложения? - person SPatil; 19.02.2011
comment
Вы знаете, как переместить someView.layer до того, как он будет отображен? Например, у меня есть длинное представление, которое мне нужно разделить на несколько страниц, поэтому мне нужно будет настроить свое представление, прежде чем отображать его на второй странице. - person Slee; 30.06.2011
comment
@PsychoDad, этот метод не зависит от drawRect. Если вы переопределили drawRect для создания пользовательского рисунка на виде, он будет отображаться в контексте как есть. - person Matt Wilding; 14.10.2011