ios - para - Dónde agregar el código de restricciones de diseño automático dentro de una vista UIV personalizada
me olvide el codigo de restricciones del iphone (2)
Me gusta configurar mi código de AutoLayout en las vistas cuando tenga más sentido. También encontré que es más fácil configurar todas las restricciones en un lugar como parte del inicio de customView.
import UIKit
class customView:UIView
{
var customLabel:UILabel = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
self.setupUI()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupUI()
{
// Setup UI
self.customLabel.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(customLabel)
// Setup Constraints
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[customLabel]|", options: NSLayoutFormatOptions.init(rawValue: 0), metrics: nil, views: ["customLabel":self.customLabel]))
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[customLabel]-10-|", options: NSLayoutFormatOptions.init(rawValue: 0), metrics: nil, views: ["customLabel":self.customLabel]))
}
}
A menudo veo que se agregan restricciones de Auto Layout en UIViewController
pero para mí ese es el lugar equivocado para la lógica de diseño.
¿Es posible agregar NSLayoutConstraint
s dentro de una vista UIView
personalizada?
¿En UIView
lugar de UIView
sería el lugar correcto para agregarlos programáticamente?
¿Es posible agregar NSLayoutConstraints dentro de una vista UIV personalizada?
Sí, es posible agregar restricciones dentro de una vista personalizada, la organización es muy importante aquí, especialmente si desea animar partes de su vista personalizada.
Lea la sección de subclases del documento de referencia UIView de Apple
Restricciones
requireConstraintBasedLayout: implemente este método de clase si su clase de vista requiere restricciones para funcionar correctamente.
updateConstraints: implemente este método si su vista necesita crear restricciones personalizadas entre sus subvistas.
alignRectForFrame :, frameForAlignmentRect: - Implemente estos métodos para anular la forma en que sus vistas se alinean con otras vistas.
¿En qué lugar de UIView es el lugar correcto para agregarlos programáticamente?
Aquí hay un esquema esqueleto de una clase personalizada. La principal preocupación es que usted centralice sus restricciones, de lo contrario, la clase se volverá muy desordenada a medida que agregue más restricciones. También puede introducir otras configuraciones en el método updateConstraints () y agregar o eliminar condicionalmente restricciones al establecer sus valores de configuración y luego llamar a setNeedsUpdateConstraints ().
Cualquier restricción que decida que quiere animar debería ser, a la ligera, variables de instancia.
Espero que esto ayude :)
class MyCustomView: UIView {
private var didSetupConstraints = false
private let myLabel = UILabel(frame: CGRectZero)
// MARK: Lifecycle
override init(frame: CGRect) {
super.init(frame: CGRectZero)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
// Mark: - Setup
private func setup() {
// 1. Setup the properties of the view it''s self
self.translatesAutoresizingMaskIntoConstraints = false
backgroundColor = UIColor.orangeColor()
clipsToBounds = true
// 2. Setup your subviews
setupMyLabel()
// 3. Inform the contraints engine to update the constraints
self.setNeedsUpdateConstraints()
}
private func setupMyLabel() {
myLabel.translatesAutoresizingMaskIntoConstraints = false
}
override func updateConstraints() {
if didSetupConstraints == false {
addConstraintsForMyLabel()
}
super.updateConstraints() //Documentation note: Call [super updateConstraints] as the final step in your implementation.
}
private func addConstraintsForMyLabel() {
// Add your constraints here
}
}