滚动时将UIScrollView捕获到UIImage中
问题描述:
我试图在外部屏幕上的iPad上查看视图中发生的情况。滚动时将UIScrollView捕获到UIImage中
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并不真正更新视图层次和布局。然而,我需要在滚动过程中捕获它。
我想:
- afterScreenUpdates:真
在scrollViewDidScroll:
- setNeedsDisplay()
- layoutIfNeeded()
- setNeedsLayout()
在滚动期间是否可以捕获滚动视图?
编辑澄清:
层次:
- 的UIWindow < - 我想快照此
- ---- UIView的
- -------- UIScrollView的< - 我不知道这个
答
请删除计时器并调用sc中的startMirroring()方法rollViewDidScroll,我已经试过您的方案,并得到了滚动型的连续监测,
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
}
}
希望这将有助于
我想捕获整个认为,“可能”含有scrollviews而不仅仅是特定scrollviews。我可以用它来处理视图层次结构中的滚动视图,因此这已经很棒了,但理想情况下,我想在没有关于视图层次结构的任何知识的情况下执行此操作。 – matteok
请保留任何View在scrollView.snapshotImage()(例如:someView.snapshotImage())的位置,它对我来说工作得很好。 –
我编辑了我的帖子以显示潜在的视图层次 – matteok