webentwicklung-frage-antwort-db.com.de

So programmieren Sie die Höhe von UIView mit Swift

Innerhalb von IB habe ich einen viewController mit segmentedControl und 2 ContainerViews. In jeder containerView habe ich eine tableView. Von jedem tableView aus schiebe ich ein detailView an. Mein automatisches Layout ist in IB.

Sobald ich ein Segment auswähle, sehe ich die entsprechende tableView. Ich wähle eine Zelle aus und die richtige DetailView wird in die Szene verschoben. 

Das Problem ist, wenn die detailView auf das segmentedControl verschoben wird, immer noch sichtbar ist. Ich habe mich entschieden, das segmentedControl zu verbergen, das funktioniert, aber es gibt dort einen großen leeren Raum. Ich habe versucht, die Ansicht von detailView programmgesteuert zu vergrößern, aber sie wird nicht erweitert. Von dem, was ich gelesen habe, liegt es daran, dass ich die anfänglichen Einschränkungen in Storyboards gemacht habe.

Wie kann ich programmgesteuert die DetailView-Ansicht erweitern?

code:

DetailViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()

 //this isn't increasing the view's size
 self.view.frame.size.height += 20.0

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)
 }

}

Fehler:

//Error for the last argument- height: *self.view.frame.height += 20.0*
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

Die linke Seite des mutierenden Operators ist nicht veränderbar: 'height' ist ein get-only Eigentum

//Error for the last argument- *self.view.frame.size.height += 20.0*:
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)

Der Initialisierer für den Typ 'CGRect' kann nicht mit einer Argumentliste von .__ aufgerufen werden. type '(x: Int, y: Int, Breite: CGFloat, height: ())'

13
Lance Samaria

Sie müssen einen Auslass für die Höhenbeschränkung der Detailansicht erstellen. Anschließend können Sie die Höhe programmgesteuert wie folgt anpassen myHeightConstraint.constant += extraHeight Dabei ist extraHeight eine Zahl, die angibt, wie viel höher die Detailansicht sein soll. Möglicherweise müssen Sie auch self.view.layoutIfNeeded() danach aufrufen.

Um einen Auslass aus einer Einschränkung zu erstellen, steuern Sie das Ziehen aus der Einschränkung im Storyboard-Editor (genau wie bei einem Auslass einer UIView) in Ihren Code. 

Sie haben recht - weil Sie das automatische Layout und die Einschränkungen verwenden, müssen die Anpassungen auch mit Einschränkungen durchgeführt werden. Das Festlegen der RAW-Frames kann zu unerwartetem Verhalten führen. Lassen Sie mich wissen, wenn Sie andere Fragen oder Schwierigkeiten haben. 

25
CoolPenguin

Im CGRect-Initialisierer sollten Sie += nicht verwenden, sondern nur +.

Veränderung:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

zu:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 20.0)

Sie sollten nicht versuchen, den Wert von self.view.frame.height im Initialisierer zu ändern.

10
rmaddy

Gibt es Höhenbeschränkungen für segmentedControl, wenn Sie diese während des Ladens der Detailansicht entfernen möchten

0
Joe

Swift 4.2

Ich erstelle programmatisch ein Beispiel für Sie: 

    var flowHeightConstraint: NSLayoutConstraint?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        view.addSubview(button)
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100).isActive = true
        flowHeightConstraint = button.heightAnchor.constraint(equalToConstant: 30)
        flowHeightConstraint?.isActive = true
    }

    @objc func animateButtonTapped() {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
            self.flowHeightConstraint?.constant = 100
            self.view.layoutIfNeeded()
        }, completion: nil)
    }

    lazy var button: UIButton = {
       let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .green
        button.addTarget(self, action: #selector(animateButtonTapped), for: .touchUpInside)
        return button
    }()

diese Codezeile erstellt eine Schaltfläche und ändert die Höhe der Schaltfläche mit Animation. 

ich hoffe das hilft :)

0
taha oraei