Как программно изменить размер представления в swift? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь изменить размер представления в контроллере представления. Значение по умолчанию для вида равно 60, при нажатии кнопки я меняю высоту вида. Когда я проверяю его в режиме отладчика, он показывает высоту нового значения, но после нескольких строк или в другой функции он автоматически возвращается к значению по умолчанию, равному 60.

@IBAction func confirmButtonWasPressed(_ sender: Any) {
    if confirmButton.titleLabel?.text == "Confirm pickup location" {
        if !(pickupLocationField.text?.isEmpty ?? false) && originLocation != nil {
            let frame = CGRect(x: searchesShadowView.frame.origin.x, y: searchesShadowView.frame.origin.y, width: searchesShadowView.frame.width, height: 115)

            self.searchesShadowView.frame = frame

            var imageView = UIImageView();
            var image = UIImage(named: "work25");
            imageView.image = image;
            dropoffLocationField.rightView = imageView;
            dropoffLocationField.rightViewMode = UITextField.ViewMode.always
        }
        else {
            showToast(with: "Select pick up location")
        }
    }
}

, иначе я использовал

@IBAction func confirmButtonWasPressed(_ sender: Any) {
    if confirmButton.titleLabel?.text == "Confirm pickup location" {
        if !(pickupLocationField.text?.isEmpty ?? false) && originLocation != nil {
            searchesShadowView.frame.size.height = 115
            var imageView = UIImageView();
            var image = UIImage(named: "work25");
            imageView.image = image;
            dropoffLocationField.rightView = imageView;
            dropoffLocationField.rightViewMode = UITextField.ViewMode.always
        }
        else {
            showToast(with: "Select pick up location")
        }
    }
}

также это searchesShadowView.heightAnchor.constraint(equalToConstant: 115).isActive = true

Ответы [ 4 ]

1 голос
/ 06 марта 2020

Вам нужно ограничить высоту ваших поисков ShadowView.

Image Outlet

@IBAction func confirmButtonWasPressed(_ sender: Any) {
       if confirmButton.titleLabel?.text == "Confirm pickup location" {
        if !(pickupLocationField.text?.isEmpty ?? false) && originLocation != nil {
            let frame = CGRect(x: searchesShadowView.frame.origin.x, y: searchesShadowView.frame.origin.y, width: searchesShadowView.frame.width, height: 115)

            DispatchQueue.main.async {
                self.heightConstrain.constant = 10
                self.view.layoutIfNeeded()
            }

            self.searchesShadowView.frame = frame

            var imageView = UIImageView();
            var image = UIImage(named: "work25");
            imageView.image = image;
            dropoffLocationField.rightView = imageView;
            dropoffLocationField.rightViewMode = UITextField.ViewMode.always
        }
        else {
            showToast(with: "Select pick up location")
        }
    }
}
0 голосов
/ 06 марта 2020

Попробуйте с этим кодом ниже.

import UIKit

class MyViewController: UIViewController {
    let searchesShadowView = UIView()
    let plusButton = UIButton()
    let minusButton = UIButton()
    var heightLayoutConstraint:NSLayoutConstraint?
    let value: CGFloat = 10.0

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    init() {
        super.init(nibName: nil, bundle: nil)
        self.view.backgroundColor = .yellow
        loadUIView()
        loadPlusButton(plusButton)
        loadMinusButton(minusButton)
    }

    func loadUIView()  {
        self.view.addSubview(searchesShadowView)
        searchesShadowView.backgroundColor = .red
        searchesShadowView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint(item: searchesShadowView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 200).isActive = true
        NSLayoutConstraint(item: searchesShadowView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50).isActive = true
        NSLayoutConstraint(item: searchesShadowView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: -50).isActive = true
        heightLayoutConstraint = NSLayoutConstraint(item: searchesShadowView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 200)
        heightLayoutConstraint?.isActive = true
    }

    func loadPlusButton(_ button: UIButton) {
        self.view.addSubview(button)
        button.tag = 1
        button.backgroundColor = UIColor.green
        button.setTitle("+", for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

        button.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint(item: button, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 100).isActive = true
        NSLayoutConstraint(item: button, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50).isActive = true
        NSLayoutConstraint(item: button, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant:
            80).isActive = true
        NSLayoutConstraint(item: button, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 30).isActive = true
    }

    func loadMinusButton(_ button: UIButton) {
        self.view.addSubview(button)
        button.tag = 0
        button.backgroundColor = UIColor.green
        button.setTitle("-", for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

        button.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint(item: button, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 100).isActive = true
        NSLayoutConstraint(item: button, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: -50).isActive = true
        NSLayoutConstraint(item: button, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant:
            80).isActive = true
        NSLayoutConstraint(item: button, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 30).isActive = true
    }

    @objc func buttonAction(sender: UIButton!) {
        UIView.animate(withDuration: 0, delay: 0.2, options: UIView.AnimationOptions.curveEaseOut, animations: {
            if sender.tag == 1 {
                self.heightLayoutConstraint?.constant += self.value
            }else{
                self.heightLayoutConstraint?.constant -= ((self.heightLayoutConstraint?.constant ?? 0)-self.value) >= 0 ? self.value : 0
            }
            self.view.layoutIfNeeded()
        }) { (value) in }
    }
}
0 голосов
/ 06 марта 2020

Вы должны создать IBOutlet ограничения высоты для searchShadowView.

 searchViewheightConstaints.constant = yourRequiredHeight

// если вы создаете из кода, используйте

searchesShadowView.translatesAutoresizingMaskIntoConstraints = false
0 голосов
/ 06 марта 2020

Сначала вы должны подключить IBOutlet ограничения высоты от Interface Builder, а затем вы можете изменить constant ограничения высоты следующим образом ->

@IBAction func confirmButtonWasPressed(_ sender: Any) {
    if confirmButton.titleLabel?.text == "Confirm pickup location" {

        if !(pickupLocationField.text?.isEmpty ?? false) && originLocation != nil {

        // You can change the value of the constraint
        searchesShadowHeightConstraint.constant = 115

        var imageView = UIImageView()
        var image = UIImage(named: "work25")
        imageView.image = image
        dropoffLocationField.rightView = imageView
        dropoffLocationField.rightViewMode = .always

    } else {
        showToast(with: "Select pick up location")
    }
    // Then you should update the layout
    view.layoutIfNeeded()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...