restricciones olvide intentos fallidos eliminar desactivar como codigo borrar ios view autolayout constraints parent-child

olvide - restricciones ios 12



Restricciones y marcos de diseño automático de iOS no funcionan (2)

Tengo una vista de desplazamiento anidada dentro de un controlador de vista que está descansado en un contenedor. El controlador de vista, que usa una clase especificada llamada ScrollingViewController ve así:

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. } }

Básicamente lo que está sucediendo es que dos controladores de vista que usan esa clase SubProfileOneViewController y SubProfileTwoViewController , respectivamente, se están instanciando como subOne y subTwo . Estos se agregan a la Vista de desplazamiento como secundarios para crear una interfaz donde el usuario puede deslizar el dedo hacia la derecha para acceder a otra vista (casi como Snapchat). subOne y subTwo deben estar uno al lado del otro y el usuario debe poder desplazarse de uno a otro y viceversa.

Así es como se ve todo esto en mi guión gráfico:

SubProfileOneViewController y SubProfileTwoViewController tienen cada uno una vista (representada por verde y rojo respectivamente) y cada uno tiene las mismas restricciones exactas que son: Altura = 262, Espacio final a supervista = 0, Espacio inicial a supervista = 0, Espacio superior a supervista = 0

Idealmente, cuando se ejecuta, debe haber dos vistas, una verde y otra roja, y el usuario debería poder deslizar entre cada una. Sin embargo, esto es lo que realmente sucede:

Las vistas verde y roja no ocupan todo el ancho de la pantalla y, en su lugar, se condensan en una pequeña franja a la izquierda, y la mayoría de los Controladores de Vista son blancos en lugar de sus respectivos colores. He intentado muchas cosas y no estoy seguro de lo que estoy haciendo mal.

(El crédito para el código en ScollingViewController va a lbrendanl en github, enlazado aquí: https://github.com/lbrendanl/SwiftSwipeView )


ScrollView con diseño automático funciona de manera diferente; puede usar solo una subvista configurando tralatesAutoresizingMaskIntoConstraints translatesAutoresizingMaskIntoConstraints = true y configurando contentSize explícitamente. O bien, establece translatesAutoresizingMaskIntoConstraints = false y deja que encuentre la restricción self. Visita este enlace para más detalles

Como desee, ambos deben tomar pantalla completa, entonces necesita agregar AutoLayoutConstraints, algo como esto

  1. Pin greenView left to super view
  2. Establezca el ancho de la vista verde en lo mismo que en scrollViewWidth, es decir, bounds.size.width (no contetnSizeWidth)
  3. Pin rojoVer izquierda a verdeVer derecha
  4. establecer el valor de ancho de redView igual que scrollViewWidth ie bounds.size.width (no contetnSize.width)

Nota: recomendaría utilizar una solución de Autolayout automático, que manejará automáticamente los cambios de orientación, los tamaños de pantalla, todo con mucho menos código y una solución más sólida que la que desarrollo a continuación .

Con el enfoque actual, utilizando UIViewControllers integrados , debe esperar a que estos controladores completen sus respectivas inicializaciones, que compiten directamente con su diseño. Tenga en cuenta que necesitará volver a calcular las posiciones + los tamaños en los cambios de orientación . Una vez más, mientras esto funciona, no es un diseño de sonido ya que requiere una gran cantidad de código, lógica y funcionalidades generales que obtendría de forma gratuita utilizando NSLayoutConstraint .

( probado, construido, vinculado y ejecutado ):

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) }

Aquí está el desplazamiento ( en acción ). Tenga en cuenta que he creado vistas de la clase ViewLayoutAssistant.swift que le permite visualizar la posición + escala muy convenientemente.

Tampoco necesita decirle a la vista que su jerarquía ha cambiado. Este último fragmento de código debería ayudarte:

@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);