2012-11-05 3 views
0

Je suis assez nouveau pour ios. Et en écrivant ma première application, j'ai rencontré que autolayout est seulement pour iOS 6.0. Et je voudrais faire mon application pour au moins 5.0 ios.ios autolayout similaire

Peut-être que quelqu'un saurait comment faire cela sans autolayout.

J'ai l'étiquette qui a le texte dynamique, 1row ou 2 rangées ou 3 rangées dépend des arrangements d'utilisateur. Et en dessous, j'ai uitextfield. Avec autolayout je n'ai pas mal à la tête car tout le travail, le champ de texte se trouve bien ci-dessous dans 1 2 ou 3 lignes de texte ci-dessus (redimensionne, se déplace automatiquement).

Alors, comment dois-je faire cela sans autolayout?

Répondre

2

Sans autolayout, vous devez gérer cela dans le code. La méthode recommandée pour cela consiste à sous-classer votre vue de conteneur (la vue qui contient votre étiquette et votre texte déposé) et à remplacer la méthode layoutSubviews. Vous définissez les cadres des sous-vues de la vue manuellement, en fonction de vos critères souhaités (par exemple, label text metrics).

EDIT: voici un exemple précis de quelque chose qui pourrait être la méthode containverViewlayoutSubviews (dactylographié à partir du haut de ma tête):

// Those could be IBOutlets, or obtained by inspecting self.subviews 
UILabel *label = self.label; 
UITextField *textField = self.textField; 

// Determine the labelSize, we could limit the maxSize (especially the height) manually here 
CGSize maxSize = self.bounds.size; 
CGSize labelSize = [label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode]; 

// Set the computed label size 
CGRect labelFrame = label.frame; 
labelFrame.size = labelSize; 
label.frame = labelFrame; 

// Now move the textField just below the label (we could also add a vertical margin here if we want) 
CGRect textFieldFrame = textField.frame; 
textFieldFrame.origin.y = labelFrame.origin.y + labelFrame.size.height; 
textField.frame = textFieldFrame; 

Ce fait juste que le champ de texte est toujours en dessous de la étiquette. En fonction des contraintes que vous avez mises en place, vous devrez peut-être ajouter du code pour vous assurer que l'interface utilisateur est correcte.

Vous devez également vous assurer que [containverView setNeedsLayout] est appelée lorsque le texte de l'étiquette change.

+0

Pouvez-vous être plus précis ou donner quelques exemples, s'il vous plaît? – Datenshi

+0

Merci beaucoup pour votre aide. Le texte ne change pas dans une vue de manière dynamique, il ne change qu'après avoir à nouveau chargé la vue. J'essaie de comprendre plus clairement que vous essayez de dire, mais juste quelques autres questions .. Si je comprends bien, je dois faire un autre .xib avec mes étiquettes? Ou dois-je faire une autre classe et obtenir des iboutlets et changer leur initialisation? Je ne peux pas faire ça sans subview? Je sais où j'ai l'étiquette et le champ de texte et seulement dans l'initialisation j'ai besoin qu'ils soient construits par les rangées sur l'étiquette – Datenshi

+0

Vous pourriez juste ajouter ce code à l'initialisation de contrôleurs de vue si vous voulez éviter de créer des sous-classes UIView et si vous savez que le la disposition ne change pas après le chargement du contrôleur. –

0

si vous utilisez ou nib storybord vous pouvez simplement supprimer la marque dans l'inspecteur des fichiers enter image description here

+0

@Datenshi vous aide? – Sosily