我正在使用SpreadsheetView并尝试使用捏合手势和比例转换将其放大。视图可以放大,但是当缩小后尝试重新加载数据时,视图的框架要小得多。这是处理视图缩放的代码段-
@IBAction func handlePinch(recognizer : UIPinchGestureRecognizer) {
if recognizer.state == .began {
lastScale = Float(recognizer.scale)
}
if recognizer.state == .began || recognizer.state == .changed {
currentScale = recognizer.view?.layer.value(forKeyPath: "transform.scale") as! Float
var newScale = 1 - (lastScale - Float(recognizer.scale))
newScale = min(newScale, SpreadsheetViewController.kMaxScale / currentScale)
newScale = max(newScale, SpreadsheetViewController.kMinScale / currentScale)
spreadsheetView.transform = spreadsheetView.transform.scaledBy(x: CGFloat(newScale), y: CGFloat(newScale))
lastScale = Float(recognizer.scale)
}
if recognizer.state == .ended {
spreadsheetView.frame = CGRect(x: 0, y: topView.frame.maxY, width: view.frame.size.width, height: view.frame.size.height - topView.frame.maxY)
print(spreadsheetView.frame.size.width)
print(spreadsheetView.scrollView.frame.size.width)
}
}
我在捏手势结束后明确设置了
spreadsheetView
的框架以覆盖UIViewController
的框架,并且在重新加载后设法保持在该框架上,但是我认为UIScrollView
内SpreadsheetView
的框架丢失了其框架。 最佳答案
SpreadsheetView
似乎使用其frame
size属性绘制其内容。修改transform
将相应地更改frame
值,因此使用这些值(而不是bounds
大小)将使最终结果错误,在您的情况下实际上缩小了两倍。这可能是SpreadsheetView
中的遗漏。
您可以通过使用SpreadsheetView
的容器来解决此问题。创建一个常规的UIView
进行转换,然后将SpreadsheetView
作为一个孩子嵌入,不进行任何转换。
我对SpreadsheetView
附带的一个演示应用程序进行了快速测试,它证实了我的想法。直接在比例为0.5、0.5的SpreadsheetView
上执行简单转换,并将背景色设置为红色,将生成此图片。请注意,红色背景是可见的,但不可见。
使用UIView
作为SpreadsheetView
的容器的相同测试,将容器缩放为0.5、0.5,并将容器的背景设置为红色,将生成此图片。按预期工作。