2017-11-15 4 views
2

UIContainerView Ändern eines View-Controller angezeigt werden:UIContainerView stoppt Berührung Empfang nach dem Rahmen

enter image description here

Jetzt bin ich binden mit diesem Code es Vollbild, wenn der Benutzer tippen Vollbild-Schaltfläche zu machen:

@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 

     } 
    } 
} 

Die Ansicht im Vollbildmodus funktioniert gut, aber wenn der Viewcontroller im Vollbildmodus angezeigt wird, hört die Ansicht auf zu reagieren. Dies passiert, wenn ich dem View-Controller Einschränkungen hinzufüge, aber wenn ich es entferne, funktioniert es gut. Warum passiert das und wie kann ich sowohl Constraint setzen als auch Touch bekommen?

enter image description here

+0

Leider Geste Erkenner ignorieren Ihre verwandeln. Daher müssen Sie die Transformation manuell auf die Berührungspunkte anwenden. Sie können dies auf verschiedene Arten tun, z. B. indem Sie den Erkenner auf die Superansicht anwenden, die inverse Transformation auf den Punkt anwenden und dann prüfen, ob er innerhalb der Grenzen der Zielansicht liegt. –

+0

@JoshHomann danke! Kannst du mir Code zeigen? –

+0

Ich bin in einem Zug. Ich werde Code hinzufügen, wenn ich nach Hause komme. Grundsätzlich ist das Problem, dass Ihre Transformation nur Ihre scheinbare Position auf dem Bildschirm beeinflusst, nicht Ihre tatsächlichen Grenzen. Deshalb sollten Sie die Transformation für vorübergehende Dinge wie Animationen verwenden und Einschränkungen verwenden, um dauerhafte Größen-/Positionswechsel vorzunehmen. In diesem Fall würde ich erwägen, die Änderung der Bedingungen hier mit dem Layout zu ändern, anstatt die Transformation zu verwenden. –

Antwort

0

ist hier ein Spielplatz zeigt, wie Sie die auf erfassten Berührungspunkt in der Superview-Transformation anwenden:

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

Danke, ich werde es überprüfen –

Verwandte Themen