0
votes

Contrainte dynamique pour UIView & Uicollection

En haut de mon écran affichera l'un des deux uiviews. L'une est la version minimisée et l'autre est la vérité maximisée.

La vue minimisée est de 30 en hauteur, tandis que la version maximisée est de 250. P>

sous présent il y a une uicollectionview. P>

Je le souhaite, de sorte que lorsque la version minimisée de l'UIView est affichée, la Topanchor Uicollectionview sera connectée à l'UIViews Basanchor. P>

Lorsque je clique sur chacun des uiviews, ils deviendront cachés et faire l'autre un visible. p>

Voici quelques captures d'écran pour aider à visualiser: p>

défaut Entrez la description de l'image ici p>

minimisé Entrez la description de l'image ici p>

tentative de maximiser Entrez la description de l'image ici p>

Ainsi, lorsque j'affiche l'UIView optimisé, je veux que la topanchor Uicollectionviews soit connectée à celle-ci à basanchor, etc. p>

actuellement Tout fonctionne, à l'exception du redimensionnement correct de l'uicollectionview. Il redimensionnera lorsque je minimise, mais ne redimensionnera pas lorsque je maximisez. P>

Mes appels de visionnementDIdload de ces fonctions: P>

"<NSLayoutConstraint:0x600000c4ed50 UIView:0x7ffd60c135e0.top == UILayoutGuide:0x6000016f89a0'UIViewSafeAreaLayoutGuide'.top   (active)>",
"<NSLayoutConstraint:0x600000c4fa20 UIView:0x7ffd60c135e0.height == 250   (active)>",
"<NSLayoutConstraint:0x600000c4bed0 UIView:0x7ffd60c13750.top == UILayoutGuide:0x6000016f89a0'UIViewSafeAreaLayoutGuide'.top   (active)>",
"<NSLayoutConstraint:0x600000c3c000 UIView:0x7ffd60c13750.height == 30   (active)>",
"<NSLayoutConstraint:0x600000c3dbd0 V:[UIView:0x7ffd60c135e0]-(0)-[UICollectionView:0x7ffd62819600]   (active)>",
"<NSLayoutConstraint:0x600000c20cd0 V:[UIView:0x7ffd60c13750]-(0)-[UICollectionView:0x7ffd62819600]   (active)>"


0 commentaires

3 Réponses :


1
votes

Je me demandais si vous avez besoin d'un appel pour mettre à jour votre mise en page. Peut-être appelé à partir de la resizeCollectionview ()? XXX PRE>

view.layoutIfNeeded()


5 commentaires

Essayé à la fois à la fois et à la fin de la resizecollectionview () mais ne fait rien. Merci d'avoir essayé!


Un simple essai simple, est défini sur IsmaxViewHidden! = IsmaxviewHiddene avant d'appeler le redimensionnement. Peut-être pas être le problème, mais essayez facile :)


Essayé à la fois sur les gestionnaires et au début et à la fin de la fonction de redimensionnement, mais rien. Il y a une erreur qui pourrait aider, voir la fin de la poste principale ci-dessus, j'ai édité pour l'ajouter :)


Je ne comprends pas désolé, pourriez-vous s'il vous plaît élaborer?


Si je supprimais Collectionview.topanchor.constraint (Egalto: Bottomanchor), rien ne semble changer et l'erreur reste



1
votes

Vous activez des contraintes contradictoires les unes sur les autres. Si vous souhaitez aller entre une vue minimisée et maximisée, changez simplement la valeur constante sur la contrainte de hauteur elle-même.

J'ai fouetté un échantillon myViewController code> dans les terrains de jeu avec 2 vues, la première de quelle taille et la couleur change lorsque vous l'appuyez sur. MyView code> est comme votre affichage repliable et myotherview code> est comme votre collectionView. P>

Permettez-moi de savoir si vous avez des questions! P>

class MyViewController : UIViewController {
    private enum ViewState {
        case min
        case max

        var height: CGFloat {
            switch self {
            case .min:
                return 30
            case .max:
                return 250
            }
        }

        var color: UIColor {
            switch self {
            case .min:
                return .red
            case .max:
                return .green
            }
        }
    }

    private var myViewState: ViewState = .min {
        didSet {
            viewStateToggled()
        }
    }

    private let myView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    private let myOtherView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = .yellow
        return view
    }()

    private lazy var myViewHeightConstraint = NSLayoutConstraint(
        item: myView,
        attribute: .height,
        relatedBy: .equal,
        toItem: nil,
        attribute: .notAnAttribute,
        multiplier: 1,
        constant: myViewState.height
    )

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white
        self.view = view
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        configureMyViews()
    }

    private func configureMyViews() {
        view.addSubview(myView)

        myView.backgroundColor = myViewState.color

        NSLayoutConstraint.activate([
            myView.topAnchor.constraint(equalTo: view.topAnchor),
            myView.leftAnchor.constraint(equalTo: view.leftAnchor),
            myView.rightAnchor.constraint(equalTo: view.rightAnchor),
            myViewHeightConstraint
        ])

        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        myView.addGestureRecognizer(tap)

        view.addSubview(myOtherView)
        NSLayoutConstraint.activate([
            myOtherView.topAnchor.constraint(equalTo: myView.bottomAnchor),
            myOtherView.leftAnchor.constraint(equalTo: view.leftAnchor),
            myOtherView.rightAnchor.constraint(equalTo: view.rightAnchor),
            myOtherView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
    }

    private func viewStateToggled() {
        myViewHeightConstraint.constant = myViewState.height
        UIView.animate(withDuration: 0.4) {
            self.myView.backgroundColor = self.myViewState.color
            self.view.layoutSubviews()
        }
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
        myViewState = myViewState == .min ? .max : .min
    }
}


0 commentaires

1
votes
    private func configureContainerView() {
        containerView = UIView()
        containerView.backgroundColor = .systemGreen
        containerView.translatesAutoresizingMaskIntoConstraints = false
        containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(containerViewTapped)))
        view.addSubview(containerView)

        containerViewHeight = containerView.heightAnchor.constraint(equalToConstant: 250)
        containerViewHeight.isActive = true

        NSLayoutConstraint.activate([
            containerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
        ])
    }

    @objc private func containerViewTapped() {
        isViewTapped.toggle()
        containerViewHeight.constant = isViewTapped ? 30 : 250

        innerMinView.isHidden = !isViewTapped
        innerMaxView.isHidden = isViewTapped
    }

    private func configureCollectionView() {

        collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: UICollectionViewFlowLayout())
        view.addSubview(collectionView)
        collectionView.backgroundColor = .systemYellow
        collectionView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            collectionView.topAnchor.constraint(equalTo: containerView.bottomAnchor),
            collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),

        ])
    }

    private func configureInnerMinView() {
        innerMinView = UIView()
        innerMinView.backgroundColor = .systemRed
        innerMinView.translatesAutoresizingMaskIntoConstraints = false
        containerView.addSubview(innerMinView)

        NSLayoutConstraint.activate([
            innerMinView.widthAnchor.constraint(equalTo: containerView.widthAnchor, multiplier: 0.8),
            innerMinView.heightAnchor.constraint(equalTo: containerView.heightAnchor, multiplier: 0.8),
            innerMinView.centerXAnchor.constraint(equalTo: containerView.centerXAnchor),
            innerMinView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor)
        ])
    }

    private func configureInnerMaxView() {
        innerMaxView = UIView()
        innerMaxView.backgroundColor = .systemBlue
        innerMaxView.translatesAutoresizingMaskIntoConstraints = false
        containerView.addSubview(innerMaxView)

        NSLayoutConstraint.activate([
            innerMaxView.widthAnchor.constraint(equalTo: containerView.widthAnchor, multiplier: 0.8),
            innerMaxView.heightAnchor.constraint(equalTo: containerView.heightAnchor, multiplier: 0.8),
            innerMaxView.centerXAnchor.constraint(equalTo: containerView.centerXAnchor),
            innerMaxView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor)
        ])
    }

0 commentaires