2017-11-15 13 views
2

UIContainerViewを変更した後、タッチを受けて停止します。UIContainerViewは、ビューコントローラを表示するには、フレーム

enter image description here

は、今私は、ユーザーがこのコードのフルスクリーンボタンをタップすると、それをフルスクリーンにするために抱き合わせています:

@IBAction func fullscreen(_ sender: Any) { 
     view.goFullscreen() 
    } 

extension CGAffineTransform { 

    static let ninetyDegreeRotation = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2)) 
} 

extension UIView { 

    var fullScreenAnimationDuration: TimeInterval { 
     return 0.15 
    } 

    func minimizeToFrame(_ frame: CGRect) { 
     UIView.animate(withDuration: fullScreenAnimationDuration) { 
      self.layer.setAffineTransform(.identity) 
      self.frame = frame 
     } 
    } 


    func goFullscreen() { 
     UIView.animate(withDuration: fullScreenAnimationDuration) { 
      self.layer.setAffineTransform(.ninetyDegreeRotation) 
      self.frame = UIScreen.main.bounds 

     } 
    } 
} 

ビューをフルスクリーンで表示するとうまくいきますが、ViewControllerがフルスクリーンの場合、ビューはタッチを停止します。これは、ビューコントローラに制約を追加するときに発生しますが、削除するとうまくいきます。なぜこれが起こり、どのように制約を設定して接触を受け取ることができますか?ここで

enter image description here

+0

は、残念ながら、ジェスチャー認識装置は、トランスフォームを無視します。したがって、トランスフォームを手動でタッチポイントに適用する必要があります。これは、スーパービューにレコグナイザを適用し、ポイントに逆変換を適用し、ターゲットビューの境界内にあるかどうかをチェックするなど、これを行うためのさまざまな方法です。 –

+0

@JoshHomannありがとう!あなたは私にいくつかのコードを教えてくれますか? –

+0

私は電車に乗っています。私は帰宅するときにコードを追加します。基本的には、変換は実際の境界線ではなく画面上の見かけの位置にのみ影響します。そのため、実際にアニメーションのような一時的なものにトランスフォームを使用し、永続的なサイズ/位置の変更を行うために制約を使用する必要があります。この場合、ここでは、変換を使用する代わりにlayoutifneededを使用して制約の変更をアニメーション化することを検討します。 –

答えて

0

あなたはスーパーで検出されたタッチポイントに変換を適用する方法を示す遊び場です:

import UIKit 
import PlaygroundSupport 

class ViewController: UIViewController { 
    private let redView = UIView() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(redView) 
     redView.translatesAutoresizingMaskIntoConstraints = false 
     redView.widthAnchor.constraint(equalToConstant: 100).isActive = true 
     redView.heightAnchor.constraint(equalToConstant: 200).isActive = true 
     redView.centerXAnchor.constraint(equalTo: redView.superview!.centerXAnchor).isActive = true 
     redView.centerYAnchor.constraint(equalTo: redView.superview!.centerYAnchor).isActive = true 
     redView.backgroundColor = .red 
     redView.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2) 
     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap)) 
     view.addGestureRecognizer(tapGestureRecognizer) 
    } 

    @objc private func tap(tapGestureRecognizer: UITapGestureRecognizer) { 
     let point = tapGestureRecognizer.location(in: redView).applying(redView.transform) 
     if redView.bounds.applying(redView.transform).contains(point) { 
      print ("You tapped inside") 
     } else { 
      print("You tapped outside)") 
     } 
    } 
} 

let v = ViewController() 
PlaygroundPage.current.liveView = v.view 
+0

ありがとう私はそれを確認します –

関連する問題