2010-09-25 3 views
1

J'utilise le toolchain iPhone sous Linux et je n'ai donc pas d'interface Builder. Alors, comment pourrais-je mettre en forme ma vue dans ma sous-classe ViewController? Par exemple, je veux un UITextView au milieu de l'écran? Dois-je faire cela dans le loadView ou viewDidLoad. Dois-je également définir la vue pour la sous-classe ViewController à elle-même?Mise en page par programme iPhone UIView?

+0

Pensez que beaucoup d'objets ont une propriété "centre". C'est un CGPoint et c'est très utile quand vous voulez centrer un objet dans l'espace. C'est mieux que d'utiliser la propriété frame où vous devez calculer les choses. – Vinzius

Répondre

2

Ce n'est pas une tâche facile de mettre en page tout le code. Voici quelques code:

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake (100, 100, 100, 100)]; 
[self.view addSubview:textView]; 

Le cadre est le lieu (le premier et le second argument est x et y coordinateur) et la taille (le troisième et le quatrième paramètre est la largeur et la hauteur de l'affichage de texte).

De cette manière, vous pouvez ajouter n'importe quelle vue dans votre classe. Une partie de la vue est intégrée et vous n'avez pas besoin de dessiner vous-même, certains ne le sont pas, et vous devez sous-classer UIView et remplacer drawRect.

Vous devriez le faire en viewDidLoad lorsque votre contrôleur principal de la vue est terminé le chargement

0

Je construis généralement toute la hiérarchie de vue dans la méthode de loadview et de réaliser la configuration supplémentaire dans le viewDidLoad, par exemple pour mettre en place le contenu de subviews à reflète les données associées au contrôleur de vue. L'important est de définir le contrôleur de vue voir sortie dans la méthode loadView.

@synthesize label; // @property(nonatomic,retain) UILabel *label declared in the interface. 

-(void)loadView { 

// Origin's y is 20 to take the status bar into account, height is 460 for the very same reason. 
UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(0,20,320,460)]; 
[aView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; 
[aView setAutoresizeSubviews:YES]; 

// The 150x50 label will appear in the middle of the view. 
UILabel *aLabel = [[UILabel alloc]initWithFrame:CGRectMake((320-150)/2,(460-50)/250,150,50)]; 

// Label will maintain the distance from the bottom and right margin upon rotation. 
[aLabel setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin]; 

// Add the label to the view hiearchy. 
[self setLabel:aLabel]; 
[aView addSubview:aLabel]; 

// Set aView outlet to be the outlet for this view controller. This is critical. 
[self setView:aView]; 

// Cleanup. 
[aLabel release]; 
[aView release]; 
} 

-(void)viewDidLoad { 

// Additional and conditional setup. 

// labelText is an istance variable that hold the current text for the label. This way, if you 
// change the label text at runtime, you will be able to restore its value if the view has been 
// unloaded because of a memory warning. 
NSString *text = [self labelText]; 
[label setText:text]; 

} 

-(void)viewDidUnload { 

// The superclass implementation will release the view outlet. 
[super viewDidUnload]; 

// Set the label to nil. 
[self setLabel:nil]; 
} 

La plus grande difficulté est sans doute de comprendre comment paramètres de la carte IB à UIView variables et méthodes, par exemple le masque de redimensionnement automatique. Les références de classe UIView et UIViewController d'Apple sont pleines d'informations utiles.

+0

Je n'utilise pas de constructeur d'interface, la première ligne de votre exemple de code serait-elle nécessaire? Je sais que je peux omettre l'IBOutlet. Puis-je également omettre la déclaration de propriété et donc la déclaration de synthèse? –

+0

Cela dépend. Tout élément que vous ajoutez en tant que descendant du point de vue est conservé et libéré avec, donc ce n'est pas nécessaire. Cependant, si j'ai besoin d'accéder à une sous-vue n'importe où dans le contrôleur, je préférerais l'avoir comme variable d'instance pratique et la mettre à nil dans viewDidUnload et la libérer dans le dealloc, comme l'étiquette de l'exemple ci-dessus. De cette façon, je ne finis pas avec un pointeur vers un objet désalloué. Vous pouvez également l'assigner manuellement ou utiliser une propriété (assign), ou lui attribuer une balise et la récupérer si nécessaire, mais la définir comme propriété (retenue) est plus sûre et plus propre. – sigsegv

Questions connexes