Добрый день!
Столкнулся с проблемой, которой боролся 5 дней и сдох…
Скинул проект состоящий их двух экранов:
- Видеокамера (тут все просто)
- Наложение на видео слоя CATextLayer из созданной пользователем textView (по кнопке справа сверху).
Суть проблемы:
- создали textView
- Пальцами покрутили
- Нажали сохранить (внизу справа кнопка)
- На выходе получили текст либо не в том месте где расположили, либо либо он в принципе уходит за экран.
Что пытался сделать:
- “копировать” frame из textview в catextlayer умножая координаты на index (Ширина видео деленная на ширину экрана, тоже самое по высоте)
- использовать тригонометрию для расчета новых координат
y’ = ycos(a) - xsin(a)
x’ = ysin(a) + xcos(a)
y’ = ycos(a) + xsin(a),
x’ = - ysin(a) + xcos(a)
Все эти способы как-то работают для определенных поворотов (допустим - поворот вправо - работает, а вверх тормашками нет).
Явно я не учитываю все параметры вращения\растяжения\верчения
Буду очень благодарен за помочь в этом вопросе.
Проект:
// MARK: - Ошибку вращения искать здесь:
let layer = CXETextLayer()
layer.foregroundColor = (arrayOfAddedTextView[0] as! UITextView).textColor?.cgColor
layer.backgroundColor = UIColor.clear.cgColor
let uiTextViewFrame = (videoPlayingView.convert((arrayOfAddedTextView[0] as! UITextView).frame, to: videoPlayingView))
let indexX: CGFloat = naturalSize.width / videoPlayingView.frame.width
let indexY: CGFloat = naturalSize.height / videoPlayingView.frame.height
layer.frame = CGRect(x: fix(uiTextViewFrame, in: videoPlayingView.frame).origin.x * indexX,
y: fix(uiTextViewFrame, in: videoPlayingView.frame).origin.y * indexY,
width: (arrayOfAddedTextView[0] as! UITextView).frame.width * indexX,
height: (arrayOfAddedTextView[0] as! UITextView).frame.height * indexY)
let radians = atan2f(Float((arrayOfAddedTextView[0] as! UITextView).transform.b), Float((arrayOfAddedTextView[0] as! UITextView).transform.a))
let flip: CGFloat? = ((arrayOfAddedTextView[0] as! UITextView) as? UITextView)?.transform.a
print("Flip x: \(((arrayOfAddedTextView[0] as! UITextView) as? UITextView)?.transform.a ?? 0.0) Y : \(((arrayOfAddedTextView[0] as! UITextView) as? UITextView)?.transform.b ?? 0.0)")
let degrees: CGFloat = CGFloat(radians * (180 / .pi))
print("Degree :\(degrees)")
let radiansToRotate: Float = (Float((.pi * -degrees) / 180))
var zRotation = CATransform3D()
zRotation = CATransform3DMakeRotation(CGFloat(radiansToRotate), 0, 0, 1.0)
layer.transform = CATransform3DScale(zRotation, 1, 1, 1)
layer.fontSize = ((arrayOfAddedTextView[0] as! UITextView).font?.pointSize)! * indexY * (flip)!
layer.string = (arrayOfAddedTextView[0] as! UITextView).text