UIGraphicsImageRenderer визуализировал UIImage нулевого размера при вращении

Я вращаю UIImageView вот так:

      imageView.transform = imageView.transform.concatenating(CGAffineTransform(rotationAngle: CGFloat(radians)))

После того, как пользователь подтвердил поворот нажатием кнопки подтверждения, угол поворота в радианах рассчитывается следующим образом:

      var rotationAngleRadians: Double {
    Double(imageView.transform.rotationAngleRadians)
}

extension CGAffineTransform {
    public var rotationAngleRadians: CGFloat {
        return atan2(b, a)
    }
}

И в конце поворачивается UIImage с помощью этого метода ( Source):

      func rotated(radians: Float) -> UIImage? {
    var newSize = CGRect(origin: CGPoint.zero, size: self.size).applying(CGAffineTransform(rotationAngle: CGFloat(radians))).size
    // Trim off the extremely small float value to prevent core graphics from rounding it up
    newSize.width = floor(newSize.width)
    newSize.height = floor(newSize.height)
    
    let renderer = UIGraphicsImageRenderer(size: newSize)
    
    let newImage = renderer.image { (context) in
        context.cgContext.translateBy(x: newSize.width / 2, y: newSize.height / 2)
        // Rotate around middle
        context.cgContext.rotate(by: CGFloat(radians))
        draw(in: CGRect(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))
    }
    
    return newImage
}

Я использую это в своей модели просмотра следующим образом:

      func rotated(image: UIImage,
             rotationAngleRadians: Double,
             completion: @escaping (UIImage?) -> Void) {
    DispatchQueue.global(qos: .userInitiated).async {[weak self] in
        func completed(image: UIImage?) {
            DispatchQueue.main.async {
                completion(image)
            }
        }
        if let img = image.rotated(radians: Float(rotationAngleRadians)),
           img.size != .zero { //TODO: It must be fixed. For preventing saving crash on disk is used this approach.
            self?.editPage(editedImage: img, rotationAngleRadians: rotationAngleRadians)
            completed(image: img)
        } else {
            completed(image: nil)
        }
    }
}

Но иногда повернутое изображение возвращает изображение нулевого размера:

      <UIImage:0x283986520 anonymous {0, 0}>

Обратная трассировка:

      [Unknown process name] CGBitmapContextInfoCreate: unable to allocate 1393990272 bytes for bitmap data
[Unknown process name] CGDisplayListDrawInContext: invalid context 0x0.
Backtrace:
<<redacted>+1796>
<<redacted>+56>
<<redacted>+40>
<<redacted>+40>
  <<redacted>+468>
   <<redacted>+124>
    <<redacted>+196>
     <$sSo7UIImageC10E7rotated7radiansABSgSf_tF+1760>
      <$s1010PERotateVMC7rotated5image20rotationAngleRadians10completionySo7UIImageC_SdyAISgctFyycfU_+100>
       <$sIeg_IeyB_TR+52>
        <_dispatch_call_block_and_release+32>
         <_dispatch_client_callout+20>
          <_dispatch_root_queue_drain+824>
           <_dispatch_worker_thread2+140>
            <_pthread_wqthread+216>                 <start_wqthread+8>
[Unknown process name] CGBitmapContextCreateImage: invalid context 0x0.
Backtrace:
<CGBitmapContextCreateImage+336>
 <<redacted>+64>
  <<redacted>+40>
   <<redacted>+40>
    <<redacted>+468>
     <<redacted>+124>
      <<redacted>+196>
       <$sSo7UIImageC10E7rotated7radiansABSgSf_tF+1760>
      <$s1010PERotateVMC7rotated5image20rotationAngleRadians10completionySo7UIImageC_SdyAISgctFyycfU_+100>
       <$sIeg_IeyB_TR+52>
        <_dispatch_call_block_and_release+32>
         <_dispatch_client_callout+20>
          <_dispatch_root_queue_drain+824>
           <_dispatch_worker_thread2+140>
            <_pthread_wqthread+216>                      <start_wqthread+8>

Как я могу это исправить?

0 ответов

Другие вопросы по тегам