2015-06-05 3 views
0

Я пытаюсь добавить два CALayers из UIImageView и UITextField в контекст, а затем создать изображение из контекста, используя UIGraphicsGetImageFromCurrentImageContext(), однако я не могу правильно позиционировать текстовое поле. Я хочу, чтобы получившееся изображение соответствовало представлению, в котором первоначально отображается изображение и текстовое поле. Вместо этого текстовое поле появляется наполовину скрытым за верхней частью изображения. В настоящее время я пытаюсь что-то вроде этого (что неправильно):Добавить правильно размещенные слои в контекст

UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, false, 0.0) 
let ctx = UIGraphicsGetCurrentContext() 
let ht = self.imageView.bounds.size.height 
let wdth = self.imageView.bounds.size.width 
self.imageView.layer.renderInContext(ctx) 

CGContextTranslateCTM(ctx, self.imageView.center.x, self.imageView.center.y) 
CGContextConcatCTM(ctx, self.imageView.transform) 
CGContextTranslateCTM(ctx, -wdth * self.imageView.layer.anchorPoint.x, -ht * self.imageView.layer.anchorPoint.y) 
// Set points for text label here, then... 
self.textLabelTop.layer.renderInContext(ctx) 

let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
return newImage 

Я понимаю CGContextTranslateCTM() и CTContextConcatCTM() должны делать с применением оригинальной системы координат на контекст, а затем поместить слой, но я не конечно, как это сделать правильно. Может ли кто-нибудь привести пример правильной техники?

Update: Это похоже на взлом, но вместо перевода баллов в контексте, если я просто добавить текстовое поле как подвид в UIImageView после редактирования и перед UIGraphicsGetImageFromCurrentImageContext(), все похоже на работу, в том числе с размещение второго текстового поля:

self.imageView.addSubview(self.textLabelTop) 
self.imageView.addSubview(self.textLabelBottom) 
UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, false, 0.0) 
let ctx = UIGraphicsGetCurrentContext() 
self.imageView.layer.renderInContext(ctx)   
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
return newImage 

ответ

1

Вы должны быть осведомлены о convertPoint:toView: возможно. попробуйте следующее:

UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, false, 0.0) 
let ctx = UIGraphicsGetCurrentContext() 
self.imageView.layer.renderInContext(ctx) 

let point = self.textLabelTop.superview!.convertPoint(self.textLabelTop.frame.origin, toView: self.imageView) 
CGContextTranslateCTM(ctx, point.x, point.y) 
self.textLabelTop.layer.renderInContext(ctx) 

let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 
return newImage 
+0

Это действительно сработало отлично. Благодаря! – Ja5onHoffman

+0

Я рад, что он решил вашу проблему! – Bannings

Смежные вопросы