2017-07-04 19 views
0

ビューのサイズを変更する際に問題が発生していますが、境界が変更されていないように見えます(ビューを狭めた後、UIViewの端を使用してピンチさらに)UIPinchGestureRecognizerが呼び出された後に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

は、これを見つけるのは本当に難しいとなっています。 Rishabhは2011年から説明なしで投稿にリンクしましたが、それ以上の変更を加えなければ動作しませんでした。

あなたはもはや view.transform.scaledBy適用する必要が境界変更する場合(X:sender.scale、Y:sender.scale)

をではなく、同様のコード

を使用して境界を変更する必要がありますが
 self.bounds = self.bounds.applying(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() 
} 
関連する問題