2015-08-05 10 views
5

Ich habe eine Scroll-Ansicht in einem View-Controller verschachtelt, die in einem Container ruht. Der View-Controller, die eine bestimmte Klasse verwendet genannt ScrollingViewController sieht wie folgt aus:iOS Auto-Layout-Einschränkungen und Frames funktioniert nicht

class ScrollingViewController: UIViewController { 

    @IBOutlet weak var scrollView: UIScrollView! //outlet for the Scroll View 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // 1) Create the two views used in the swipe container view 
     var storyboard = UIStoryboard(name: "App", bundle: nil) 
     var subOne: SubProfileOneViewController = storyboard.instantiateViewControllerWithIdentifier("subone") as! SubProfileOneViewController 
     var subTwo: SubProfileTwoViewController = storyboard.instantiateViewControllerWithIdentifier("subtwo") as! SubProfileTwoViewController 

     // 2) Add in each view to the container view hierarchy 
     // Add them in opposite order since the view hierarchy is a stack 
     self.addChildViewController(subTwo); 
     self.scrollView!.addSubview(subTwo.view); 
     subTwo.didMoveToParentViewController(self); 

     self.addChildViewController(subOne); 
     self.scrollView!.addSubview(subOne.view); 
     subOne.didMoveToParentViewController(self); 

     // 3) Set up the frames of the view controllers to align 
     // with each other inside the container view 
     var adminFrame :CGRect = subOne.view.frame; 
     adminFrame.origin.x = adminFrame.width; 
     subTwo.view.frame = adminFrame; 

     // 4) Finally set the size of the scroll view that contains the frames 
     var scrollWidth: CGFloat = 2 * self.view.frame.width 
     var scrollHeight: CGFloat = 262 
     self.scrollView!.contentSize = CGSizeMake(scrollWidth, scrollHeight); 
     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

Im Grunde, was passiert ist, dass zwei View-Controller, der diese Klasse verwenden SubProfileOneViewController und SubProfileTwoViewController jeweils als subOne und subTwo instanziiert wird. Diese werden dann als untergeordnete Elemente in die Bildlaufansicht eingefügt, um eine Oberfläche zu erstellen, über die der Benutzer nach rechts wischen kann, um auf eine andere Ansicht zuzugreifen (fast wie Snapchat). subOne und subTwo sollten nebeneinander liegen und der Benutzer sollte in der Lage sein, von einem zum nächsten zu blättern und umgekehrt.

Hier ist, was das alles wie auf meinem Drehbuch aussieht: enter image description here

SubProfileOneViewController und SubProfileTwoViewController jeweils eine Ansicht (repräsentiert durch grüne und rote respectively) und jeweils die gleichen genauen Randbedingungen, die sind: Höhe = 262, Nachgestellte Platz für superview = 0, führender Platz für superview = 0, oberster Platz für superview = 0

Idealerweise sollten zwei Ansichten angezeigt werden, eine grün und eine rot, und der Benutzer sollte zwischen den beiden Ansichten wechseln können . Allerdings ist hier, was tatsächlich passiert: enter image description here

Die grünen und roten Ansichten, die die gesamte Bildschirmbreite nicht nehmen und stattdessen in einen kleinen Splitter auf der linken Seite kondensiert, und die Mehrheit der Ansicht Controller sind weiß statt ihre jeweilige Farbe. Ich habe viele Dinge ausprobiert und bin mir nicht sicher, was ich falsch mache.

(Kredit für Code in ScollingViewController auf Github lbrendanl geht, hier verbunden: https://github.com/lbrendanl/SwiftSwipeView)

+0

Welche Einschränkungen haben Sie für die Containeransichten in scrollview verwendet? Können Sie ein Beispielprojekt posten? –

+0

Ich würde eine einzelne UIView (contentView) zu Ihrem 'UIScrollView' hinzufügen. Fügen Sie dann Ihre Kind-Controller-Ansichten in der Inhaltsansicht hinzu. Fügen Sie Einschränkungen für Ihre untergeordneten Ansichten hinzu, die ihre obere und untere Seite an die Inhaltsansicht anheften. Für Ansicht eins, fixieren Sie das führende Element in die Inhaltsansicht und fixieren Sie das nachfolgende Element, um zwei führende Elemente anzuzeigen. Zum Schluss fixieren Sie die Ansicht von zwei nach der Inhaltsansicht. Um die Breite zu korrigieren, müssen Sie für die Breite der Ansicht eins und der Ansicht zwei Einschränkungen treffen: oder eine Breiteneinschränkung für die x2-Ansicht contentView hinzufügen und Einschränkungen für Ansicht eins und Ansicht zwei für gleiche Breite hinzufügen. –

Antwort

2

Hinweis:ich empfehlen würde eine Autolayout-Lösung, die Orientierungsänderungen automatisch behandelt, Bildschirmgrößen, die alle mit viel weniger Code und robustere Lösung als das, was ich unten entwickle.

Mit dem aktuellen Ansatz, mit eingebettetUIViewControllers, müssen Sie für diese Controller warten, um ihre jeweiligen Initialisierungen zu vervollständigen, die mit Ihrem Layout in direktem Wettbewerb stehen. Beachten Sie, dass Sie Positionen + Größen bei Richtungsänderungen neu berechnen müssen. Noch einmal, während dies funktioniert, ist es nicht ein Sound-Design, da es für eine Menge Code, Logik und allgemeine Funktionen, die Sie kostenlos mit NSLayoutConstraint erhalten würde.

(getestet, gebaut, verbunden und lief):

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    // 3) Set up the frames of the view controllers to align 
    // with each other inside the container view 
    var adminFrame = self.view.frame 
    subOne.view.frame = adminFrame 
    adminFrame.offset(dx: self.view.frame.width, dy: 0) 
    subTwo.view.frame = adminFrame; 

    // 4) Finally set the size of the scroll view that contains the frames 
    let scrollWidth = 2 * self.view.frame.width 
    self.scrollView!.contentSize = CGSizeMake(scrollWidth, self.view.frame.height) 
} 

Hier ist das Scrollen (in Aktion). Beachten Sie, dass ich Ansichten der Klasse ViewLayoutAssistant.swift erstellt habe, mit der Sie Position + Skala sehr bequem visualisieren können.

enter image description here

Sie brauchen auch nicht die Ansicht, ihre Hierarchie geändert hat zu erzählen.Dieses letzte Stück Code sollte erhalten Sie gehen:

@IBOutlet weak var scrollView: UIScrollView! 
weak var subOne: SubProfileOneViewController! 
weak var subTwo: SubProfileTwoViewController! 

    self.addChildViewController(subTwo); 
    self.scrollView!.addSubview(subTwo.view); 
    self.addChildViewController(subOne); 
    self.scrollView!.addSubview(subOne.view); 
2

Scroll mit automatischem Layout funktioniert anders entweder nur ein Subview translatesAutoresizingMaskIntoConstraints = true indem verwenden kann und Einstellung Content explizit. Oder Sie setzen translatesAutoresizingMaskIntoConstraints = false und lassen es sich selbst herausfinden. Besuchen Sie diese link für mehr Details

Wie Sie wollen beide Vollbild nehmen sollte, dann müssen Sie AutoLayoutConstraints hinzufügen, so etwas wie dieses

  1. Pin Greenview zu super Blick links
  2. Set Green Breite gleiche wie scrollViewWidth rechts
  3. Satz Redview Breitenwert gleichen dh bounds.size.width (nicht contetnSizeWidth)
  4. Pin Redview zu Greenview links, wie scrollViewWidth dh bounds.size.width (nicht contetnSize.width)