Search code examples
iosswiftfunctionnslayoutconstraint

how to create function that return NSLayoutConstraint


hey developer I want to ask, I have a repeated create constraint and then I try to create a function that return NSLayoutConstraint. then I got confuse what should I return since there is 3 different UIView in my function. here I show you my code.

NSLayoutConstraint.activate([
            subtitlebl.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
            subtitlebl.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 18),

            profileImageView.topAnchor.constraint(equalTo: subtitlebl.bottomAnchor, constant: 24),
            profileImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 18),
            profileImageView.widthAnchor.constraint(equalToConstant: 68),
            profileImageView.heightAnchor.constraint(equalToConstant: 68),

            editButton.topAnchor.constraint(equalTo: subtitlebl.bottomAnchor, constant: 49),
            editButton.leadingAnchor.constraint(equalTo: profileImageView.trailingAnchor, constant: 12),
            editButton.widthAnchor.constraint(equalToConstant: 104),
            editButton.heightAnchor.constraint(equalToConstant: 20),

            profileNameStackView.topAnchor.constraint(equalTo: profileImageView.bottomAnchor, constant: 30),
            profileNameStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 24),
            profileNameStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -24),
            profileNameStackView.heightAnchor.constraint(equalToConstant: 74),

            phoneStackView.topAnchor.constraint(equalTo: profileNameStackView.bottomAnchor, constant: 30),
            phoneStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 24),
            phoneStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -24),
            phoneStackView.heightAnchor.constraint(equalToConstant: 74),

            createStackViewConstraint(stackView: profileNameStackView, topStackView: profileImageView, label: profileNameLbl, textFIeld: profileNameTextField)
)]

   private func createStackViewConstraint(stackView: UIStackView, topStackView: UIView, label: UILabel, textFIeld: UITextField) -> NSLayoutConstraint {
       stackView.topAnchor.constraint(equalTo: topStackView.bottomAnchor, constant: 30).isActive = true
       stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 24).isActive = true
       stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -24).isActive = true
       stackView.heightAnchor.constraint(equalToConstant: 74).isActive = true

       label.heightAnchor.constraint(equalToConstant: 18).isActive = true
       textFIeld.heightAnchor.constraint(equalToConstant: 48).isActive = true
    }

Solution

  • good job, But there are few mistakes in your code.

    • you add return type to your function.Adding constraints to some component is Void type.It will return nothing.(so remove it)
    • you add profileNameStackView constraints in NSLayoutConstraint.activate and call your function to add again.

    try this, make sure your your components

    translatesAutoresizingMaskIntoConstraints = false

     NSLayoutConstraint.activate([
                    subtitlebl.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
                    subtitlebl.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 18),
    
                    profileImageView.topAnchor.constraint(equalTo: subtitlebl.bottomAnchor, constant: 24),
                    profileImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 18),
                    profileImageView.widthAnchor.constraint(equalToConstant: 68),
                    profileImageView.heightAnchor.constraint(equalToConstant: 68),
    
                    editButton.topAnchor.constraint(equalTo: subtitlebl.bottomAnchor, constant: 49),
                    editButton.leadingAnchor.constraint(equalTo: profileImageView.trailingAnchor, constant: 12),
                    editButton.widthAnchor.constraint(equalToConstant: 104),
                    editButton.heightAnchor.constraint(equalToConstant: 20),
    
        )]
        //add constraints to profileNameStackView
        createStackViewConstraint(stackView: profileNameStackView, topStackView: profileImageView, label: profileNameLbl, textFIeld: profileNameTextField)
    
    
        //add constraints to phoneStackView
        createStackViewConstraint(stackView: phoneStackView, topStackView: profileNameStackView, label: phoneLbl, textFIeld: phoneTextField)
    
    
    //your function
           private func createStackViewConstraint(stackView: UIStackView, topStackView: UIView, label: UILabel, textFIeld: UITextField) -> NSLayoutConstraint {
               stackView.topAnchor.constraint(equalTo: topStackView.bottomAnchor, constant: 30).isActive = true
               stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 24).isActive = true
               stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -24).isActive = true
               stackView.heightAnchor.constraint(equalToConstant: 74).isActive = true
    
               label.heightAnchor.constraint(equalToConstant: 18).isActive = true
               textFIeld.heightAnchor.constraint(equalToConstant: 48).isActive = true
            }