Ho una vista di scorrimento annidata all'interno di un controller di visualizzazione che si trova in un contenitore. Il View Controller, che utilizza una classe specificata chiamato ScrollingViewController
assomiglia a questo:Vincoli di layout automatico iOS e frame non funzionanti
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.
}
}
In sostanza quello che sta succedendo è che due Visualizza i controllori che utilizzano tale classe SubProfileOneViewController
e SubProfileTwoViewController
rispettivamente, vengono istanziati come subOne
e subTwo
. Questi vengono quindi aggiunti alla Vista di scorrimento come bambini al fine di creare un'interfaccia in cui l'utente può scorrere verso destra per accedere a un'altra vista (quasi come Snapchat). subOne
e subTwo
devono essere affiancati e l'utente dovrebbe essere in grado di scorrere da uno a quello successivo e viceversa.
Ecco cosa tutto questo appare come il mio storyboard:
SubProfileOneViewController
e SubProfileTwoViewController
ogni avere una vista (rappresentato da verde e rosso rispettivamente) e hanno ciascuno gli stessi vincoli precisi, che sono: Altezza = 262, Trailing spazio a superview = 0, Spazio principale a superview = 0, Spazio superiore a superview = 0
Idealmente, quando eseguito, ci dovrebbero essere due viste, una verde e una rossa e l'utente dovrebbe essere in grado di scorrere tra ciascuna . Tuttavia, ecco ciò che effettivamente accade:
I punti di vista verde e rossa non occupano l'intera larghezza dello schermo e invece sono condensati in un piccolo frammento a sinistra, e la maggior parte della vista controllori sono bianchi, invece di il loro colore rispettivo. Ho provato molte cose e non sono sicuro di cosa sto sbagliando.
(credito per il codice in ScollingViewController
va a lbrendanl su GitHub, collegati qui: https://github.com/lbrendanl/SwiftSwipeView)
quali vincoli sono stati utilizzati per le viste del contenitore all'interno di scrollview. puoi pubblicare un progetto di esempio? –
Vorrei aggiungere un singolo UIView (contentView) al tuo 'UIScrollView'. Quindi aggiungi le visualizzazioni del controller figlio all'interno della visualizzazione del contenuto. Aggiungi i vincoli per le tue visuali secondarie che pongono il loro lato superiore e inferiore alla vista del contenuto. Per visualizzarne uno, collegare il leader alla vista del contenuto, quindi pin il suo trascinamento per visualizzare due leader. Finalmente la visualizzazione pin due finali alla vista del contenuto. Per forzare le larghezze a destra sono necessari vincoli per la larghezza per la vista uno e la vista due: o aggiungere un vincolo di larghezza per contentView per essere la schermata x2 e aggiungere vincoli per la vista uno e visualizzare due per avere larghezza uguale. –