Soy novato y escribí una vista personalizada heredada de StackView y creé un button mediante programación con pocos atributos y cuando lo agrego a mi vista personalizada, tengo dos problemas:
addArrangedSubview(myBtn) , mi vista ignora los atributos que agregué y llena todo el ancho. Pero si uso addSubView(myBtn) , está bien (un cuadrado azul en 44x44)addArrangedSubview(myBtn) , addTarget() no funciona y no se puede hacer clic en myBtn , pero cuando uso addSubView(myBtn) , funciona perfectamente.Aquí está mi clase de vista personalizada:
import UIKit class RatingControl: UIStackView { //MARK: Initialization override init(frame: CGRect) { super.init(frame: frame) setupButtons() } required init(coder: NSCoder) { super.init(coder:coder) setupButtons() } //MARK: Private Methods private func setupButtons() { // Create the button let button = UIButton() button.backgroundColor = UIColor.blue // Add constraints button.translatesAutoresizingMaskIntoConstraints = false button.heightAnchor.constraint(equalToConstant: 44.0).isActive = true button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true // Setup the button action button.addTarget(self, action: #selector(ratingButtonTapped(_:)), for: .touchUpInside) // Add the button to the stack addArrangedSubview(button) } //MARK: Button Action @objc func ratingButtonTapped(_ sender: Any) { print("Button pressed 👍") } }Aquí está la vista previa:
¿Cuál es la diferencia entre addSubView() y addArrangedSubview() ? ¿Por qué suceden estos problemas?
Supongo que desea agregar varios botones horizontalmente (como con un control de calificación típico de "estrellas").
Un UIStackView , como se puede deducir de su método .addArrangedSubview() , organiza sus subvistas, en función de sus .axis , .alignment , .distribution y .spacing , así como su frame .
Entonces, lea un poco sobre UIStackView y cómo se puede usar. Lo más probable es que actualmente esté restringiendo su vista personalizada con:
Entonces, agregar su botón como un arrangedSubView da como resultado que se extienda al ancho de la vista de pila, porque ese es el valor predeterminado.
Agregarlo como una subview simplemente superpone el botón en la vista de pila, en lugar de permitir que la vista de pila lo organice, y es probable que su vista de pila tenga una altura de cero, por lo que no se puede tocar el botón.
Intente establecer solo restricciones superiores e iniciales cuando agregue su vista de pila personalizada. Eso debería darte un botón de 44 x 44 que se puede tocar.
A medida que agregue más botones usando .addArrangedSubview() , esos botones se organizarán horizontalmente, que es probablemente lo que desea.