2016-07-14 16 views
1

geändert habe ich eine UIView und in diesem UIView habe ich eine andere UIView, können sagen, Eltern und Kind UIView. Ich habe Höhe und Breite der Eltern UIView auf 400 in storyboard eingestellt und setzen Kindansicht constraint bis 8px Marge von oben, links, rechts und unten aus seiner Superview.-Layout nicht ändern, wenn Eltern (UIView) Größe

Aber wenn ich die Größe der übergeordneten Ansicht auf 200 ändern, bleibt die Größe der untergeordneten Ansicht gleich. Ich habe diese beiden versucht, in viewdidload und viewdidappear

CGRect frm = self.mainTimerView.frame; 
frm.size.width = size; 
frm.size.height = size; 
self.mainTimerView.frame = frm; 

, wenn ich Eltern im Hinblick auf 200 Kind ändern sollte es sich von selbst zu 200-16 Höhe und Breite festgelegt nach Einschränkungen.

+0

Sie nehmen die Größe von "mainTimerView" und dann wieder "mainTimerView" mit gleicher Größe. Wie kann es dann ändern? – WasimSafdar

+0

call [parent layoutIfNeeded] – akc

+0

Wasim Ich ändere seine Breite und Höhe in der zweiten und dritten Zeile und dann wieder zu mainTimerView zuweisen – Yawar

Antwort

1

Sie sollten nicht mit der Verwendung von frame.If Sie die Größe ändern möchten mit uiconstraint mischen, wenn uiconstraint verwenden, können Sie den Ausgang der Einschränkung machen sollte, und dann die Konstante property.Call layoutIfNeeded, die Einschränkung ändern, dann können Sie nimm den richtigen Rahmen.

@interface ViewController() 

@property (weak, nonatomic) IBOutlet UIButton *mainTimerView; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *mainTimerViewHeightConstraint; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.view layoutIfNeeded]; 
    NSLog(@"%@",@(self.mainTimerView.frame.size.width)); 

    self.mainTimerViewHeightConstraint.constant = 100; 

    [self.view layoutIfNeeded]; 
    NSLog(@"%@",@(self.mainTimerView.frame.size.height)); 
} 

@end 

aufrufen layoutIfNeeded Ziel, um das Layout von Subviews zu zwingen, vor dem Zeichnen, dann viewDidLayoutSubviews aufgerufen. Beachten Sie, dass Sie den richtigen Frame in viewDidLayoutSubviews erhalten können. Mit anderen Worten, Sie können den richtigen Rahmen erhalten, nachdem viewDidLayoutSubviews aufgerufen wurde.

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    NSLog(@"%@",NSStringFromCGRect(self.mainTimerView.frame)); 
} 
0

Haben Sie versucht, setNeedsLayout in der übergeordneten Ansicht aufzurufen? Dieser Aufruf wird verwendet, um eine Ansicht zu veranlassen, ihre Unteransichten zu planen. Aus dem 10 Diskussionsabschnitt:

Rufen Sie diese Methode im Hauptthread Ihrer Anwendung auf, wenn Sie das Layout der Unterviews einer Ansicht anpassen möchten. Diese Methode notiert die Anfrage und kehrt sofort zurück. Da diese Methode keine sofortige Aktualisierung erzwingt, sondern stattdessen auf den nächsten Aktualisierungszyklus wartet, können Sie damit das Layout mehrerer Ansichten ungültig machen, bevor eine dieser Ansichten aktualisiert wird. Mit diesem Verhalten können Sie alle Layoutupdates auf einen Aktualisierungszyklus konsolidieren, der in der Regel die Leistung verbessert.

Aufruf layoutIfNeeded könnte eine andere Option sein. Laut den Dokumenten erzwingt es jedoch ein sofortiges Layout und bietet daher nicht den durch die Verwendung von setNeedsLayout gewonnenen Konsolidierungsvorteil.

layoutIfNeeded Dokumention:

die Subviews sofort Ordnet.

2

1) Ändern der height constraint des mainview.

2) Rufen Sie die layoutIfNeeded Methode auf.

3) Tun Sie es auf viewDidAppear.

0

enter image description here

Plz die IBOutlet Höhen Constraint der Elternansicht erstellen.

IBOutlet NSLayoutConstraint *RedViewHeightconstraint; 

- (void)viewWillAppear:(BOOL)animated 
{ 
    RedViewHeightconstraint.constant = 500; 
} 

es für Sie arbeiten wird

0

Sie müssen nur IBOutlets von Einschränkungen der Höhe und Breite des mainTimerView erstellen. Sobald Sie fügen so diese Zeilen Code:

constraintOuterViewHt.constant = 200 constraintOuterViewWidth.constant = 200

Sie brauchen nichts anderes zu tun. Check screen shot here