Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 滚动时将UIScrollView捕获到UIImage中_Ios_Swift_Uiscrollview - Fatal编程技术网

Ios 滚动时将UIScrollView捕获到UIImage中

Ios 滚动时将UIScrollView捕获到UIImage中,ios,swift,uiscrollview,Ios,Swift,Uiscrollview,我试着在一个外部屏幕上,在iPad的视图中镜像正在发生的事情 func startMirroring() { Timer.scheduledTimer(timeInterval:0.05, target: self, selector: #selector(tick), userInfo: nil, repeats: true) } func tick() { let snapshot = someView.snapshotImage() placeSomewhereE

我试着在一个外部屏幕上,在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
    }
}
问题

滚动视图中的滚动仅在滚动结束后反映在快照中。我相信scrollview并不是为了提高效率而在滚动过程中更新它的视图层次结构和布局。但是,我需要在滚动期间捕获它

我试过:

  • AfterScreen更新:正确
在scrollViewDidScroll中:

  • setNeedsDisplay()
  • layoutIfNeeded()
  • setNeedsLayout()
是否可以在滚动期间捕获滚动视图

编辑以澄清:

层次结构:


  • UIWindow请删除计时器并调用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
      }
    }
    

    希望对您有所帮助

    请删除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
      }
    }
    

    希望它会有所帮助

    我想捕获一个“可能”包含滚动视图的完整视图,而不仅仅是特定的滚动视图。我可以用它来处理视图层次结构中的滚动视图,所以这已经很好了,但理想情况下我想在不了解视图层次结构的情况下进行。请保留任何视图来代替scrollView.snapshotImage()(例如:someView.snapshotImage()),它对我来说工作正常。虽然这不是理想的解决方案,在scrollViewDidScroll中触发捕获确实有效,因此我将接受此答案。我希望捕获“可能”包含ScrollView而不仅仅是特定ScrollView的整个视图。我可以用它来处理视图层次结构中的滚动视图,所以这已经很好了,但理想情况下我想在不了解视图层次结构的情况下进行。请保留任何视图来代替scrollView.snapshotImage()(例如:someView.snapshotImage()),它对我来说工作正常。虽然这不是理想的解决方案,在scrollViewDidScroll中触发捕获确实有效,因此我接受这个答案。