2015-06-24 7 views
6

Ich habe drei Ansichten als Subview wie unten gezeigt mit gleicher Breite & Höhe ConstraintAutomatische Anordnung Problem für die Breite gleichmäßig in iOS iPhone

enter image description here

Sollte die Ansicht B keine Daten dann sollte es wie unten zeigen enter image description here

Mein versuchen Wenn iset B Breite als Null ist, dann alle Ansichten Null wird Breite.

Wie bekomme ich das?

Danke

+0

Ist Ansicht B der einzige, der keine Daten aufweisen kann, oder es zu einem der drei Ansichten passieren kann? Ist es auch möglich, dass 2 Ansichten keine Daten haben? – pteofil

+0

Was ist dein Ziel iOS? Ist es iOS 8.0 oder eine frühere Version? –

+0

@robmayoff iOS 7 & iOS 8, aber Sie können mir auch antworten, wenn dies nur für iOS 8 möglich ist. – user2526811

Antwort

3

Was können Sie tun, ist eine Breite Constraint es (mittlere) hinzufügen und machen weniger als 2000 mit Priorität (1000) größer ist als die gleiche Breite (750)

Jetzt machen Sie eine Steckdose und die Konstante von mit Einschränkung (< 2000) auf Null.

Sie können die sample here finden.

Warum habe ich die 2000 gesetzt, weil diese Einschränkung nur benötigt wird, um die Breite auf Null. Es sollte die Breite nicht beeinflussen, wenn die Breite ungleich Null ist. Nun, da die Breite gleich ist (mittlere Ansicht) und weniger als 2000 sein sollte, wird die Ansicht gleichmäßig auf dem Bildschirm angezeigt. Und wenn ich die Breitenbeschränkung auf Null setze, wird die Breite der mittleren Ansicht Null, da ihre Priorität höher ist als die gleichen Breiten.

enter image description here


Dieser Code setzt die Breite der mittleren Sicht auf Null.

- (IBAction)btnClick:(id)sender { 
    self.widthView2.constant = 0; 
} 

Ausgang:

enter image description here

+0

ja, es ist toll Aber sollte ich auch denselben Login für andere Ansicht verwenden? Was ist, wenn nur Ansicht A Daten enthält? – user2526811

+0

Sie können die gleiche Logik mit der gesamten Ansicht verwenden, erstellen Sie die Breiteneinschränkung für die gesamte Ansicht und machen Sie sie null, genau wie die mittlere –

+0

Was ist, wenn nur Ansicht A Daten enthält? – user2526811

1

Zunächst müssen Sie verstehen, dass Sie Prioritäten zu verschiedenen Einschränkungen in iOS geben kann. Standardmäßig ist die Priorität 1000, was der höchste Wert ist.

Jetzt müssen Sie Ihren equalWidth Beschränkungen eine Priorität von 750 geben. Zweitens müssen Sie horizontalen Abstand von ViewA zu ViewB und ViewB zu ViewC anwenden. Idealerweise sollte die Konstante für den horizontalen Abstand 0 sein, wodurch die Seiten der drei Ansichten zusammenkleben.

Und jetzt, wenn Sie die Breite für ViewB gleich 0 machen, werden Ihre ViewA und ViewC den gesamten Platz einnehmen, mit gleichen Breiten und ViewB wird verschwinden.

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Verwirrung in diesem haben.

+0

Danke für deine Antwort, aber sollte ich 'View B.hidden = YES' verstecken oder die Breite konstant auf Null setzen? – user2526811

+0

Sie müssen die Weitenkonstante von ViewB auf 0 setzen. Außerdem benötigen Sie eine weitere Einschränkung für 'equalWidth' zwischen ViewA und ViewC mit einer Priorität von 750. – danialzahid94

+0

funktioniert nicht, da ich ViewA, View B & View C gleich gesetzt habe Breiten haben Priorität mit 1000 – user2526811

2

Erstens, stellen Sie sicher, dass Ihre gleicher Breite Einschränkungen sind wie folgt aufgebaut:

A.width == B.width 
A.width == C.width 

Und nicht wie folgt aus:

A.width == B.width 
C.width == B.width 

Das heißt, stellen Sie sicher, Ansicht B nur beteiligt ist in eine Gleichbreite Einschränkung.

Als nächstes stellen Auslässen B sehen und mit der gleichen Breitenbeschränkung auf Sicht B.

@property (nonatomic, strong) IBOutlet UIView *viewB; 
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bEqualWidthConstraint; 

die Einschränkung Steckdose anzuschließen, müssen Sie die Einschränkung in dem Storyboard-Umrisse finden. Es wird eine der Beschränkungen für den nächsten gemeinsamen Vorfahren von A und B sein; es wird nicht direkt auf A oder B sein. Wenn Sie es in der Storyboard-Gliederung finden, können Sie es per Drag-and-Drop in den Quellcode ziehen (oder Sie können eine neue Outlet-Funktion erstellen, indem Sie das Steuerelement an eine beliebige Stelle in Ihrem @interface ziehen).

eine andere Eigenschaft weiteren hinzufügen Einschränkung Einstellung B Breite auf Null zu halten:

@property (nonatomic, strong) NSLayoutConstraint *bZeroWidthConstraint; 

initialisieren bZeroWidthConstraint aber nicht installieren:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.bZeroWidthConstraint = [NSLayoutConstraint 
     constraintWithItem:self.viewB attribute:NSLayoutAttributeWidth 
     relatedBy:NSLayoutRelationEqual 
     toItem:nil attribute:NSLayoutAttributeNotAnAttribute 
     multiplier:0 constant:0]; 
} 

Wenn Sie Ansicht B ausblenden möchten, deinstallieren Sie bEqualWidthConstraint und installieren Sie bZeroWidthConstraint.

Auf iOS 8.0 können Sie eine Integritätsbedingung deinstallieren, indem Sie die active-Eigenschaft auf NO setzen. In früheren Versionen müssen Sie jedoch eine Nachricht an die Ansicht senden, in der die Integritätsbedingung installiert ist. Das ist normalerweise der nächste gemeinsame Vorfahre der eingeschränkten Ansichten. Unter der Annahme der gemeinsamen Vorfahren von A und B viewB.superview ist:

- (void)hideB { 
    [self.viewB.superview removeConstraint:self.bEqualWidthConstraint]; 
    [self.viewB addConstraint:self.bZeroWidthConstraint]; 
} 

Beachten Sie, dass seit bZeroWidthConstraint nur Ansicht B beschränkt, können Sie es direkt auf Sicht B. installieren können

Wenn Sie Ansicht B zeigen wollen wieder deinstallieren bZeroWidthConstraint und neu installieren bEqualWidthConstraint:

- (void)showB { 
    [self.viewB removeConstraint:self.bZeroWidthConstraint]; 
    [self.viewB.superview addConstraint:self.bEqualWidthConstraint]; 
} 
+0

Danke für Ihre Antwort ... Warten Sie ... Ich implementiere .... – user2526811

+0

ja, es ist super aber was ist mit anderen? – user2526811

+0

es ist fantastisch und funktioniert gut, aber sollte ich die gleiche Logik für andere auch verwenden? – user2526811

0

Laden Sie den Code: Set Einschränkungen nach Ihren Wünschen. Click to Download

schaffen NSLayoutConstraint _distance_ViewA_ViewC Variable für Abstand zwischen ViewA zu ViewC

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    //when viewB is hidden remove the comments 
    _distance_ViewA_ViewC.constant = 8.0f; 
    _viewB.hidden = true; 

} 

OutPut

Für viewA, viewB, viewC


enter image description here

enter image description here

für viewA, ViewC und viewB ist versteckt

enter image description here enter image description here

Verwandte Themen