UITextView -> CATextLayer -> Видеопоток с камеры

avplayer
swift

#1

Добрый день!
Столкнулся с проблемой, которой боролся 5 дней и сдох…
Скинул проект состоящий их двух экранов:

  1. Видеокамера (тут все просто)
  2. Наложение на видео слоя CATextLayer из созданной пользователем textView (по кнопке справа сверху).

Суть проблемы:

  1. создали textView
  2. Пальцами покрутили
  3. Нажали сохранить (внизу справа кнопка)
  4. На выходе получили текст либо не в том месте где расположили, либо либо он в принципе уходит за экран.

Что пытался сделать:

  1. “копировать” frame из textview в catextlayer умножая координаты на index (Ширина видео деленная на ширину экрана, тоже самое по высоте)
  2. использовать тригонометрию для расчета новых координат
    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


#2

Товарищи математики, ну хоть намекните порядок расчетов…
Или не расчетов.
В чем ошибка…?