我正在渲染当前屏幕(Map屏幕)到放大效果较小的视图。这是发生在我当前的应用程序。
问题说明
我的应用程序占用110 MB内存。只要我开始拖动注解,内存达到130-140 MB,然后触摸结束系统强制调用。
预期行为
应用程序不应自动调用touchEnded。
我在拖动注解时所做的是将一个放大的视图添加到一个较小的视图中。2下面是我的draw方法代码。
public override func draw(_ rect: CGRect) {
UIGraphicsBeginImageContextWithOptions(self.magnifiedView!.bounds.size, false, 0.0);
guard let context = UIGraphicsGetCurrentContext() else { return }
context.translateBy(x: radius, y: radius)
context.scaleBy(x: scale, y: scale)
context.translateBy(x: -magnifiedPoint.x, y: -magnifiedPoint.y)
removeFromSuperview()
self.subviews.first?.removeFromSuperview()
magnifiedView?.layer.render(in: context)
let mapImage = UIGraphicsGetImageFromCurrentImageContext();
self.addSubview(UIImageView(image: mapImage))
magnifiedView?.addSubview(self)
UIGraphicsEndImageContext();
}
当用户开始拖动注解时,我就开始调用setNeedDisplay,一次又一次地触发绘制方法。我不知道该怎么办,我完全被困在这一点上了。请帮助我。
谢谢。
1条答案
按热度按时间fnatzsnv1#
最大的问题是根本不应该重写
draw
。这段代码所做的只是更新图像视图的image
属性。draw
不是执行此操作的正确位置。draw
只应该用于将内容实际绘制到self
中。它不应该用于更新子视图。它不应该添加或删除视图。它绝对不应该't用于从视图分层结构中移除self
。当然,调用
removeFromSuperview()
是没有帮助的。这可能就是为什么拖动被取消的原因。您需要将视图保留在原位。保留图像视图。保留此视图。生成新图像并使用新图像更新图像视图的
image
属性。不要删除任何视图。在此过程中不要添加任何视图。将生成和更新新图像的代码放入一个函数中,当拖动操作移动时可以调用该函数。如果您正在使用平移手势识别器,则该函数可以位于平移手势识别器的处理程序中。如果您正在重写各种
touches...
方法,则该函数可以位于touchesMoved(with:)
中。