#swift #uitextview #screen-resolution #drawrect #ios-camera
#swift #uitextview #разрешение экрана #drawrect #ios-камера
Вопрос:
У меня есть камера, которая предоставляет мне UIImage с разрешением 1920×1080, я внедрил систему, в которой я могу добавлять UITextViews в качестве вложенных представлений, и моя цель — добавить их в исходное UIImage и экспортировать окончательное изображение с разрешением 1920×1080.
Итак, процедура, о которой я думал, заключается в следующем:
-
Я добавляю верхний вид поверх view.frame, который отвечает за рисование всех текстовых представлений, присутствующих на экране.
-
Затем я хочу добавить это представление поверх исходного UIImage, пропорционально масштабируя его
Это код, который я реализовал для этого:
func passingAndDrawingTextViews(textViews : [UITextView], viewPassed : UIView, inImage : UIImage) -> UIImage{
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(viewPassed.frame.size, false, scale)
viewPassed.draw(CGRect(x: 0, y: 0, width: viewPassed.frame.width, height: viewPassed.frame.height))
//adding each textView
textViews.forEach { (textView) in
let textColor = textView.textColor
let textFont = UIFont(name: textView.font!.fontName, size: textView.font!.pointSize)
let textAlignment = textView.textAlignment
//alignment of the text
let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = textAlignment
let textFontAttributes = [
NSAttributedString.Key.font: textFont,
NSAttributedString.Key.foregroundColor: textColor,
NSAttributedString.Key.paragraphStyle : paragraphStyle,
]
let rect = CGRect(x: textView.frame.minX textView.textContainer.lineFragmentPadding, y: textView.frame.minY textView.textContainerInset.top, width: textView.frame.width, height: textView.frame.height)
textView.text.draw(in: rect, withAttributes: textFontAttributes as [NSAttributedString.Key : Any])
}
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIGraphicsBeginImageContext(inImage.size)
let rect = CGRect(x: 0, y: 0, width: inImage.size.width, height: inImage.size.height)
inImage.draw(in: CGRect(x: 0, y: 0, width: inImage.size.width, height: inImage.size.height))
newImage!.draw(in: rect)
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return result!
}
В функции я соответственно передаю список текстовых представлений, верхний вид и исходное изображение.
Но проблема в том, что текстовое представление, которое я получаю, растягивается по оси x. Я не знаю, почему это происходит.
Что я получаю:
Чего я хочу
Ответ №1:
прямоугольник, который вы передаете в этой строке :
newImage!.draw(in: rect)
на самом деле это размер экрана, поэтому изображение будет растягиваться, чтобы заполнить этот прямоугольник.
итак, сделайте это :
let rect = CGRect(x: 0, y: 0, width: inImage.size.width, height: inImage.size.height)
размер передаваемого изображения.
Комментарии:
1. Я не вижу никакой разницы между кодом, который вы предлагаете, и тем, который я реализую
2. измените значения на реальный размер вашего нового изображения. пусть rect = CGRect(x: 0, y: 0, ширина: 300, высота: 200) и проверьте разницу.