ios 在目标c中自动调用的奇怪行为touch结束

w46czmvw  于 2022-12-15  发布在  iOS
关注(0)|答案(1)|浏览(140)

我正在渲染当前屏幕(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,一次又一次地触发绘制方法。我不知道该怎么办,我完全被困在这一点上了。请帮助我。
谢谢。

fnatzsnv

fnatzsnv1#

最大的问题是根本不应该重写draw。这段代码所做的只是更新图像视图的image属性。draw不是执行此操作的正确位置。draw只应该用于将内容实际绘制到self中。它不应该用于更新子视图。它不应该添加或删除视图。它绝对不应该't用于从视图分层结构中移除self
当然,调用removeFromSuperview()是没有帮助的。这可能就是为什么拖动被取消的原因。您需要将视图保留在原位。
保留图像视图。保留此视图。生成新图像并使用新图像更新图像视图的image属性。不要删除任何视图。在此过程中不要添加任何视图。
将生成和更新新图像的代码放入一个函数中,当拖动操作移动时可以调用该函数。如果您正在使用平移手势识别器,则该函数可以位于平移手势识别器的处理程序中。如果您正在重写各种touches...方法,则该函数可以位于touchesMoved(with:)中。

相关问题