应用缩放变换后重新加载视图会破坏其中的UIScrollView框架

时间:2018-02-12 04:51:35

标签: ios swift uiscrollview

我正在使用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

1 个答案:

答案 0 :(得分:1)

SpreadsheetView似乎使用其frame尺寸属性来绘制其内容。修改transform会相应地更改frame值,因此使用这些(而不是bounds尺寸)会使最终结果出错,在您的情况下有效缩小两次。这可能是SpreadsheetView中的错过。

您可以使用SpreadsheetView的容器解决此问题。创建常规UIView以进行转换,并将SpreadsheetView作为子项嵌入,而不进行任何转换。

我对SpreadsheetView中包含的其中一个演示应用进行了快速测试,这证实了我的想法。直接在SpreadsheetView上使用刻度0.5,0.5进行简单变换,并将背景颜色设置为红色,得到此图片。请注意,红色背景是可见的,它不应该是。

enter image description here

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

enter image description here

相关问题