webentwicklung-frage-antwort-db.com.de

iOS Autolayout - Wie Sie zwei unterschiedliche Abstände zwischen den Ansichten einstellen, hängt von der Bildschirmhöhe ab

Ich weiß, dass mir etwas fehlt, weil dies leicht zu erreichen ist.

Mein Problem ist, dass ich in meinem "Ladebildschirm" (dem Bildschirm, der direkt nach dem Splash erscheint) eine UIImageView mit zwei verschiedenen Bildern für 3,5 "und 4" -Bildschirm hat. An einem bestimmten Ort dieser Bilder füge ich einen UIActivityIndicator ein, um dem Benutzer mitzuteilen, dass die App etwas im Hintergrund lädt. Dieser Ort ist für beide Bilder nicht derselbe, da eines davon offensichtlich höher ist als das andere. Daher möchte ich eine Autolayout-Einschränkung festlegen, die es mir ermöglicht, diesen Aktivitätsindikator auf unterschiedliche Höhen zu setzen iPhone 5 oder nicht.

Ohne Autolayout würde ich frame.Origin.y der Ansicht (zum Beispiel) auf 300 setzen, und dann in der viewDidLoad-Methode des ViewControllers würde ich fragen, ob die App in einem iPhone 5 ausgeführt wird. d Ändern Sie den Wert beispielsweise auf 350. Ich habe keine Ahnung, wie Sie dies mit Autolayout tun sollen, und ich denke, es muss ziemlich einfach sein.

36
Daniel

Sie können einen NSLayoutConstraint-Auslass auf Ihrem View-Controller erstellen und den Auslass mit der Y-Einschränkung der Aktivitätsanzeige in Ihrem Xib oder Storyboard verbinden. Fügen Sie dem View-Controller dann eine updateViewContraints-Methode hinzu und aktualisieren Sie die Konstante der Einschränkung entsprechend der Bildschirmgröße.

 connecting constraint to outlet

Hier ist ein Beispiel für updateViewConstraints:

- (void)updateViewConstraints {
    [super updateViewConstraints];
    self.activityIndicatorYConstraint.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}

Natürlich sollten Sie statt 200 und 100 die entsprechenden Werte eingeben. Möglicherweise möchten Sie einige benannte Konstanten definieren. Vergessen Sie auch nicht, [super updateViewConstraints] aufzurufen.

109
rob mayoff

Das Problem der Antwort von @Rob ist, dass Sie für jede Einschränkung viel Code ausführen sollten. Um dieses Problem zu lösen, fügen Sie einfach die ConstraintLayout-Klasse zu Ihrem Code hinzu und ändern Sie den konstanten Wert der Einschränkung für das in der IB gewünschte Gerät: 

 enter image description here

//
//  LayoutConstraint.Swift
//  MyConstraintLayout
//
//  Created by Hamza Ghazouani on 19/05/2016.
//  Copyright © 2016 Hamza Ghazouani. All rights reserved.
//

import UIKit

@IBDesignable
class LayoutConstraint: NSLayoutConstraint {

    @IBInspectable
    var ????3¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 480 {
                constant = ????3¨5_insh
            }
        }
    }

    @IBInspectable
    var ????4¨0_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                constant = ????4¨0_insh
            }
        }
    }

    @IBInspectable
    var ????4¨7_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                constant = ????4¨7_insh
            }
        }
    }

    @IBInspectable
    var ????5¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                constant = ????5¨5_insh
            }
        }
    }
}

Vergessen Sie nicht, Ihre Klasseneinschränkung von ConstraintLayout.__ zu erben. Ich werde bald die object-c-Version hinzufügen 

17
Hamza

Das grundlegende Werkzeug in Auto Layout zum Verwalten der Position von UI-Objekten sind die Einschränkungen. Eine Einschränkung beschreibt eine geometrische Beziehung zwischen zwei Ansichten. Beispielsweise haben Sie möglicherweise eine Einschränkung, die besagt: “Der rechte Rand der Fortschrittsleiste ist mit dem linken Rand eines Lables verbunden, zwischen dem sich 40 Punkte Leerzeichen befinden.”

Das bedeutet, dass Sie mit AutoLayout keine bedingten Positionseinstellungen basierend auf dem UIDevice-Modus vornehmen können. Stattdessen können Sie ein Ansichtslayout erstellen, das sich selbst ändert, wenn z. Die App kann auf 3,5 'Vollbild (IPhone4) oder 4' Vollbild (IPhone5) basierend auf den Einschränkungen ausgeführt werden.

Also Optionen für dein Problem mit Constraints:

1) Finden Sie eine Ansicht Ihres Layouts, die zum Erstellen einer Einschränkung zum Positionieren der Fortschrittsleiste verwendet werden kann. (Wählen Sie die Ansicht und die Fortschrittsleiste mit der CMD-Taste aus und verwenden Sie dann den Menüpunkt Editor/Pin/Vertikaler Abstand, um eine vertikale Einschränkung zwischen den beiden Objekten zu erstellen.)

2) Erstellen Sie eine absolute Einschränkung, um die Position des Fortschrittsbalkens an der Bildschirmkante (Abstand) oder zentral zu fixieren

Ich habe dieses Tutorial über AutoLayout als hilfreich empfunden, was auch für Sie von Vorteil sein könnte: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Hinweis: Autolayout funktioniert nur ab IOS 6.

1
nzs

Im Allgemeinen versuche ich immer, im Interface Builder zu bleiben, um Einschränkungen festzulegen. In Code zu tauchen, um mehr Kontrolle zu haben, ist normalerweise nützlich, wenn Sie beispielsweise auf dem iPhone 4 und 6 ein völlig anderes Layout haben.

Wie bereits erwähnt, können Sie im Interface Builder keine Bedingungen haben. Das Verknüpfen einer Einschränkung mit Ihrem View-Controller ist praktisch.

Hier finden Sie eine kurze Erklärung zu drei Ansätzen, um Probleme mit dem automatischen Layout für verschiedene Bildschirmgrößen zu lösen: http://candycode.io/how-to-set-up-different-auto-layout-constraints-für-different-screen-sizes/

0
Jure