我注意到一个问题,我调整了视图的大小,但边界似乎没有改变(所以在捏视图后你必须使用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函数)能够正确调整边界?
答案 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