一旦调用UIPinchGestureRecognizer,就改变UIView的界限

时间:2017-07-04 08:55:23

标签: ios swift uiview

我注意到一个问题,我调整了视图的大小,但边界似乎没有改变(所以在捏视图后你必须使用UIView的边缘来进一步捏合)

@IBAction private func handlePinch(_ sender: UIPinchGestureRecognizer) {
    if let view = sender.view {
        view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
        sender.scale = 1
    }
}

我发现了一个可能的stackoverflow回答iphone uiview - resize frame to fit subviews,它给出了一个扩展来调整大小以适应子视图,但是对象的行为没有可观察到的差异。

@IBAction private func handlePinch(_ sender: UIPinchGestureRecognizer) {
    if let view = sender.view {
        view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
        sender.scale = 1
    }
    self.resizeToFitSubviews()
}


extension UIView {
func resizeToFitSubviews() {
    let subviewsRect = subviews.reduce(CGRect.zero) {
        $0.union($1.frame)
    }
    let fix = subviewsRect.origin
    subviews.forEach {
        $0.frame.offsetBy(dx: -fix.x, dy: -fix.y)
    }
    frame.offsetBy(dx: fix.x, dy: fix.y)
    frame.size = subviewsRect.size
}

如何使夹点(以及最终具有相同问题的handleRotate函数)能够正确调整边界?

2 个答案:

答案 0 :(得分:0)

更改变换不会改变边界。

请参考这里的答案: Does the bounds of a uiview change when a pinch gesture is used on it?

答案 1 :(得分:0)

对于寻找答案的人来说,这一点非常棘手。 Rishabh与2011年的一篇文章有​​关,没有任何解释,如果不做进一步的修改,它也无效。

如果您正在更改界限,则不再需要申请   view.transform.scaledBy(x:sender.scale,y:sender.scale)

,而是需要使用类似的代码

更改边界
@IBAction private func handlePinch(_ sender: UIPinchGestureRecognizer) {
    if let view = sender.view {
        self.bounds = self.bounds.applying(view.transform.scaledBy(x: sender.scale, y: sender.scale))
        sender.scale = 1
    }
        self.resizeToFitSubviews()
}

所以完整的代码可以是:

fsns/train/train-00511-of-00512Hi