Ios 滚动时将UIScrollView捕获到UIImage中
我试着在一个外部屏幕上,在iPad的视图中镜像正在发生的事情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
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更新:正确
- 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中触发捕获确实有效,因此我接受这个答案。