【问题标题】:capture UIScrollView into UIImage while scrolling滚动时将 UIScrollView 捕获到 UIImage 中
【发布时间】:2018-02-04 05:51:42
【问题描述】:

我正在尝试在外部屏幕上反映 iPad 视图中正在发生的事情。

func startMirroring() {
    Timer.scheduledTimer(timeInterval:0.05, target: self, selector: #selector(tick), userInfo: nil, repeats: true)
}

func tick() {
    let snapshot = someView.snapshotImage()
    placeSomewhereElse(image: snapshot)
}

extension UIView {
    func snapshotImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
        drawHierarchy(in: bounds, afterScreenUpdates: false)
        let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapshotImage
    }
}

问题

在滚动视图中滚动只会在滚动结束后反映在快照中。我相信滚动视图在滚动过程中并没有真正更新它的视图层次结构和布局以提高效率。但是,我需要在滚动过程中捕获它。

我试过了:

  • afterScreenUpdates:真

在scrollViewDidScroll中:

  • setNeedsDisplay()
  • layoutIfNeeded()
  • setNeedsLayout()

是否可以在滚动过程中捕获滚动视图?

编辑澄清:

层次结构:

  • UIWindow
  • ----UIView
  • --------UIScrollView

【问题讨论】:

    标签: ios swift uiscrollview


    【解决方案1】:

    请移除Timer并调用scrollViewDidScroll中的startMirroring()方法,我已经尝试过你的场景并得到了scrollview的持续监控,

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("scrolling")
        startMirroring()
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        print("scrolling ends")
    }
    
    func startMirroring() {
        imgView.image = scrollView.snapshotImage()
    }
    
    extension UIView {
      func snapshotImage() -> UIImage? {
          UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
          drawHierarchy(in: bounds, afterScreenUpdates: false)
          let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
          UIGraphicsEndImageContext()
          return snapshotImage
      }
    }
    

    希望对你有帮助

    【讨论】:

    • 我想捕获一个“可能”包含滚动视图而不仅仅是特定滚动视图的整个视图。我可以用它来以不同的方式处理视图层次结构中的滚动视图,所以这已经很棒了,但理想情况下我想在不了解视图层次结构的情况下这样做。
    • 请保留任何 View 代替 scrollView.snapshotImage() (例如: someView.snapshotImage()) ,它对我来说工作正常。
    • 虽然这不是理想的解决方案,但在 scrollViewDidScroll 中触发捕获确实有效,所以我会接受这个答案。
    猜你喜欢
    • 2018-12-05
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多