Soy un principiante en Swift/iOS Dev. Viniendo del desarrollador web, el modelo de diseño es completamente confuso para mí en comparación con el modelo DOM/Box. Sé que significa entender todo, pero por mi vida, parece que no puedo entenderlo, esperaba que un ejemplo básico como ese pudiera ayudar a ilustrar algunas cosas, incluso cuando estoy usando un DSL como snapkit: http://snapkit.io/
¿Cómo podría construir las restricciones para un diseño como el siguiente?
Lo que tengo hasta ahora, que es -claramente- incorrecto es lo siguiente:
label1.snp.makeConstraints { (make) -> Void in make.leading.equalTo(Style.MARGIN) make.trailing.equalTo(-Style.MARGIN) make.centerX.equalTo(self) make.top.equalTo(Style.MARGIN) } label2.snp.makeConstraints { (make) -> Void in make.leading.equalTo(Style.MARGIN) make.trailing.equalTo(-Style.MARGIN) make.centerX.equalTo(self) make.top.equalTo(label1.snp.bottom) } exampleImage.snp.makeConstraints { (make) -> Void in make.leading.equalTo(0) make.trailing.equalTo(0) make.top.equalTo(label2.snp.bottom).offset(Style.MARGIN) make.bottom.equalTo(0) } donde Style.MARGIN es solo una constante establecida en 20
Siento que solo necesito ver un ejemplo como este para comprender cómo fluye y se construye el diseño, y tal vez dejar de construirlo como lo haría con un sitio web. Creo que, en un nivel más básico, lo más confuso para mí es entender cómo los objetos de diferentes alturas dinámicas se pueden colocar debajo del anterior y hacer que tableViewCell también cambie de tamaño en consecuencia.
Desde iOS 9, se pueden crear muchos diseños simples como este usando UIStackViews, que son vistas de contenedores que administran subvistas y sus restricciones de diseño para que no tenga que hacerlo (como el crítico nostálgico).
UIStackViews tiene muchos beneficios, además de ser un concepto simple. Funcionan bien, son fáciles de usar y facilitan ocultar/mostrar vistas sin manipular ni actualizar muchas restricciones manualmente.
En este caso, tiene dos UILabels y un UIImageView apilados uno encima del otro con algo de espacio. Si tuviera que implementar este diseño, agruparía las dos etiquetas juntas en un UIStackView, lo agregaría a un UIView con algunas inserciones y agregaría esa vista a otro UIStackView junto con el UIImageView de esta manera:
UI StackView (1)
Vista de interfaz de usuario (2)
UI StackView (3)
Etiqueta de interfaz de usuario (4)
Etiqueta de interfaz de usuario (5)
UIImageView (6)
Y en código:
let containerStackView = UIStackView() // (1) containerStackView.axis = .vertical let greenLabel = UILabel() // (4) greenLabel.text = "Hello," let blueLabel = UILabel() // (5) blueLabel.text = "World!" let textStackView = UIStackView() // (3) textStackView.axis = .vertical textStackView.spacing = 10 textStackView.addArrangedSubview(greenLabel) textStackView.addArrangedSubview(blueLabel) let textContainerView = UIView() // (2) textContainerView.addSubview(textStackView) textStackView.snp.makeConstraints { make in make.edges.equalToSuperview().inset(20) } let imageView = UIImageView(image: UIImage(named: "my-image") // (6) containerStackView.addArrangedSubview(textContainerView) containerStackView.addArrangedSubview(imageView)Y luego debe restringir la vista de la pila de contenedores a la vista de contenido de su UITableViewCell:
contentView.addSubview(containerStackView) containerStackView.snp.makeConstraints { make in make.edges.equalToSuperview() }Así es como lo haría. Por supuesto, su enfoque de administrar las restricciones usted mismo es igualmente válido y se haría de la siguiente manera:
contentView.addSubview(label1) label1.snp.makeConstraints { make in make.leading.equalToSuperview().offset(20) make.trailing.equalToSuperview().offset(-20) make.top.equalToSuperview().offset(20) } contentView.addSubview(label2) label2.snp.makeConstraints { make in make.leading.equalToSuperview().offset(20) make.trailing.equalToSuperview().offset(-20) make.top.equalTo(label1.snp.bottom).offset(10) } contentView.addSubview(exampleImage) exampleImage.snp.makeConstraints { make in make.leading.trailing.bottom.equalToSuperview() make.top.equalTo(label2.snp.bottom).offset(20) }Tenga en cuenta que escribí esto en un editor de texto, por lo que puede haber algunos errores tipográficos, pero la idea general debería mantenerse.
Aquí hay una lista de cosas que debe especificar, ya sea directa o indirectamente, cuando agrega restricciones:
Pensar en cada una de esas cosas cuando haces restricciones puede hacer que esto sea muy sencillo.
Primero, label1 .
Esto se traduce en las siguientes restricciones:
make.topMargin.equalTo(20) make.leftMargin.equalTo(20) make.rightMargin.equalTo(-20) make.height.equalToSuperview().dividedBy(3) Ahora para la label2 :
label1Esto se traduce a:
make.top.equalTo(label1.snp.bottom).offset(10) make.leftMargin.equalTo(20) make.rightMargin.equalTo(-20) make.bottomMargin.equalTo(-20) También podría usar un UIStackView para lograr esto.
Para obtener información sobre cómo hacer que la vista de tabla cambie el tamaño de la altura de sus celdas según el contenido, consultethis .