我正在尝试在外部屏幕上镜像 iPad View 中发生的事情。
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 中滚动只会在滚动结束后反射(reflect)在快照中。我相信 ScrollView 在滚动期间并没有真正更新它的 View 层次结构和布局以提高效率。但是,我需要在滚动过程中捕获它。
我试过:
- 屏幕更新后:真
在 scrollViewDidScroll 中:
- setNeedsDisplay()
- layoutIfNeeded()
- setNeedsLayout()
是否可以在滚动过程中捕获 ScrollView ?
编辑澄清:
层次结构:
- UIWindow <- 我想截屏
- ----UIView
- --------UIScrollView <- 我不知道这个
最佳答案
请移除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
}
}
希望对你有帮助
关于ios - 滚动时将 UIScrollView 捕获到 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45893940/