2016-09-08 6 views
0

ich eine Methode alsimmer durch seltsame Verhalten von Viewcontroller-Methode sehr verwirrt

override func viewDidLayoutSubviews() { 

    // creating bottom line for textField 
     let border = CALayer() 
     let width = CGFloat(1.0) 
     border.borderColor = UIColor.whiteColor().CGColor 
     border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - width, width: emailTextField.frame.size.width, height: emailTextField.frame.size.height) 

     border.borderWidth = width 
     emailTextField.layer.addSublayer(border) 
     emailTextField.layer.masksToBounds = true 

} 

Jetzt haben overrided was passiert ist, dass, wenn ich auf Iphone meine app laufen 6, 6+ alles funktioniert gut. Aber wenn ich den gleichen Code auf iphone5 (Simulator + echte Gerät) viewDidLayoutSubViews läuft wird immer unendlich oft aufgerufen und meine App reagiert nicht mehr. Ich löste das Problem, indem ich eine bool Variable verwendete. Aber ich verstehe nicht, warum das passiert. Kann mir das bitte jemand erklären?

Danke :-)

Antwort

2

Wie docs sagt, dass viewDidLayoutSubviews Verfahren zur Änderung Layout

aufgerufen, zu benachrichtigen, den View-Controller, der seine Ansicht hat gerade angelegt seine Subviews benötigen. Wenn sich die Grenzen für die Ansicht eines Ansichtscontrollers ändern, passt die Ansicht die Positionen seiner Unteransichten an, und dann ruft das System diese Methode auf. Diese aufgerufene Methode zeigt jedoch nicht an, dass die einzelnen Layouts der Unteransichten der Ansicht angepasst wurden. Jede Unteransicht ist dafür verantwortlich, ihr eigenes Layout anzupassen.

Ihren Code viewDidLoad Methode verschieben oder zu loadView wenn Sie nicht xibs oder Storyboards verwenden

override func viewDidLoad() { 

    // creating bottom line for textField 
     let border = CALayer() 
     let width = CGFloat(1.0) 
     border.borderColor = UIColor.whiteColor().CGColor 
     border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - width, width: emailTextField.frame.size.width, height: emailTextField.frame.size.height) 

     border.borderWidth = width 
     emailTextField.layer.addSublayer(border) 
     emailTextField.layer.masksToBounds = true 

} 

Wenn Sie möchten border.frame ändern Sie es auf Klassenvariable setzen und es in viewDidLayoutSubviews Methode ändern

override func viewDidLayoutSubviews() { 
     self.border.frame = CGRect(x: 0, y: emailTextField.frame.size.height - width, width: emailTextField.frame.size.width, height: emailTextField.frame.size.height) 
     self.border.borderWidth = width  
} 
+0

eigentlich Problem ist gelöst, aber was ich nicht verstehe ist, warum die App nicht auf iPhone 6 und 6+ fest, warum nur auf dem iPhone 5? –

+0

Ich denke, der Unterschied zwischen iOS-Versionen und RAM-Speicher Grenzen in Geräten – iSashok

+1

@UmairAfzal Ihr Problem ist nicht gelöst. Sie verwenden eine sehr schlechte Übung, um dieses Problem zu lösen, das Blockieren der Methode ist nie die richtige Wahl. 'viewDidLayoutSubviews' dient zum Positionieren von Ansichten, nicht zum Erstellen und Hinzufügen von Ansichten. Verschieben Sie diesen Code wie oben beschrieben in viewDidLoad. Sie werden jedes Mal auf dieses Problem stoßen –

0

Gerade

emailTextField.layer.addSublayer(border) 

mit diesem ersetzen:

emailTextField.addSublayer(border) 

-> Sie wollen Unterschicht auf einen Blick hinzuzufügen - wie Sie masksToBounds Eigenschaft anwenden möchten es entweder.

0

Verschieben Sie Ihre Implementierung in viewDidLayoutSubviews. Ich habe das gleiche Problem. Ich hoffe, es wird funktionieren.

+0

Ich denke, es ist schon da –