2017-02-13 2 views
0

Ich möchte eine einfache Swift 3 iOS 10 App mit zwei verschiedenen Layouts nach Größenklassen erstellen. Wenn meine viewController eine traitCollection.verticalSizeClass vom Typ .regular hat, möchte ich meine blueView (eine Unterklasse von UIView) die tableView.tableHeaderView mit einer Höhe von 50 sein. Wenn meine viewController eine traitCollection.verticalSizeClass des Typs .compact hat, möchte ich meine blueView auf der linken Seite sein (mit einer Auto-Layout-Breitenbeschränkung von 240) und meine tableView auf der rechten Seite sein.Falscher Frame für Ansicht in tableView.tableHeaderView nach einer zweiten Umdrehung


Dies ist der Code meiner UIViewController Beispiel:

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! { 
     didSet { 
      tableView.dataSource = self 
      tableView.delegate = self 
     } 
    } 
    @IBOutlet weak var blueView: UIView! 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     return tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     if self.traitCollection.verticalSizeClass == .regular { 
      blueView.bounds = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.bounds.width, height: 50) 
      tableView.tableHeaderView = blueView 
     } else { 
      self.tableView.tableHeaderView = nil 
     } 
    } 

} 

Der folgende Screenshot zeigt das Storyboard mit Szenen im Portrait-Modus eingestellt:

enter image description here

Der folgende Screenshot der zeigt, Storyboard mit Szenen im Querformat:

enter image description here

Das komplette Projekt finden Sie unter Github repo.


Alles funktioniert beim Start gut: blueView als tableView.tableHeaderView gesetzt und hat die richtige Höhe von 50. Wenn ich mein Gerät rotiere, funktioniert alles noch gut: blueView und tableView haben korrekte Einschränkungen.

Wenn ich jedoch das Gerät ein zweites Mal drehe, verschwindet blueView aus der Sicht des Controllers und tableView zeigt einen leeren tableHeaderView an. Was kann ich tun, um dieses Problem zu lösen?

Antwort

0

Falsche Auto Layout Einschränkungen waren verantwortlich für mein Problem. Ich habe es gelöst, indem blueView 's constraints und durch blueView' s translatesAutoresizingMaskIntoConstraints Eigenschaft bei jeder Umdrehung zu entfernen.

Obwohl ich bezweifle, dass dies der beste Weg, um dieses Problem zu lösen ist, funktioniert der folgende Code und generiert keine Auto-Layout-Einschränkungen Fehlerprotokolle.

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! { 
     didSet { 
      tableView.dataSource = self 
      tableView.delegate = self 
     } 
    } 
    @IBOutlet weak var blueView: UIView! 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     return tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    } 

    override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     if self.traitCollection.verticalSizeClass == .regular { 
      blueView.removeConstraints(blueView.constraints) 
      //blueView.constraints.forEach({ $0.isActive = false }) also works 
      blueView.translatesAutoresizingMaskIntoConstraints = true 
      blueView.bounds = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.bounds.width, height: 50) 
      tableView.tableHeaderView = blueView 
     } else { 
      blueView.removeConstraints(blueView.constraints) 
      //blueView.constraints.forEach({ $0.isActive = false }) also works 
      blueView.translatesAutoresizingMaskIntoConstraints = false 
      self.tableView.tableHeaderView = nil 
     } 
    } 

} 
Verwandte Themen