我正在使用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的框架,并且在重新加载后设法保持在该框架上,但是我认为UIScrollViewSpreadsheetView的框架丢失了其框架。

最佳答案

SpreadsheetView似乎使用其frame size属性绘制其内容。修改transform将相应地更改frame值,因此使用这些值(而不是bounds大小)将使最终结果错误,在您的情况下实际上缩小了两倍。这可能是SpreadsheetView中的遗漏。

您可以通过使用SpreadsheetView的容器来解决此问题。创建一个常规的UIView进行转换,然后将SpreadsheetView作为一个孩子嵌入,不进行任何转换。

我对SpreadsheetView附带的一个演示应用程序进行了快速测试,它证实了我的想法。直接在比例为0.5、0.5的SpreadsheetView上执行简单转换,并将背景色设置为红色,将生成此图片。请注意,红色背景是可见的,但不可见。

ios - 应用比例变换后重新加载 View 会破坏其中的UIScrollView框架-LMLPHP

使用UIView作为SpreadsheetView的容器的相同测试,将容器缩放为0.5、0.5,并将容器的背景设置为红色,将生成此图片。按预期工作。

ios - 应用比例变换后重新加载 View 会破坏其中的UIScrollView框架-LMLPHP

10-08 14:14