2009-11-03 2 views
0

J'ai créé par programmation une vue de connexion et une vue de table.Bogues graphiques lors de la création par programme de UILabel, UITextField, etc.

Dans certaines circonstances que je ne peux pas reproduire il se produire quelques bugs visuels étranges:

  • texte avec quelques lettres ayant une taille de police différente que d'autres
  • Un bouton où la frontière est pas initialement indiqué, mais seulement si vous cliquez dessus. Dans le même cas, la bordure du bouton peut être montrée dans un UITextField au lieu de la placeholder (voir capture d'écran)
  • Une étiquette apparaissant pas au bon endroit, mais dans le champ de texte mentionné ci-dessus, à l'envers (j'ai fait parvient pas à capture d'écran celui encore)

ci-dessous, j'ai ajouté deux captures d'écran avec la plupart de l'application noircies, ne montrant que les bugs:

http://uppix.net/b/c/4/dd1e41acb94b7d0ad8eb173772e97.png     http://uppix.net/b/f/2/a5993440c07753b851701068330be.png

H Vous pouvez voir que le texte est mélangé avec différentes tailles de police.

Ces erreurs ne se produisent pas régulièrement ou sont reproductibles.

J'ai ajouté le code de l'écran de connexion ci-dessous:

// Implement loadView to create a view hierarchy programmatically, without 
// using a nib. 
    - (void)loadView { 
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    UIFont* font = [UIFont systemFontOfSize:14]; 

float midLine = 100.0; 
float height = 30.0; 
float borderY = 70.0; 
float borderX = 10.0; 
float width = 320.0 - borderX * 2.0; 
float paddingX = 10.0; 
float paddingY = 5.0; 

CGRect usernameLabelRect = CGRectMake(borderX, borderY, midLine, height); 
CGRect usernameFieldRect = CGRectMake(borderX + midLine + paddingX, borderY, 
           width - midLine - paddingX - 40 , height); 

CGRect passwordLabelRect = CGRectMake(borderX, borderY + height + paddingY, 
           midLine, height); 
CGRect passwordFieldRect = CGRectMake(borderX + midLine + paddingX, 
           borderY + height + paddingY, 
           width - midLine - paddingX - 40, height); 

CGRect loginButtonRect = CGRectMake(borderX + 40, 
           borderY + height*2 + paddingY*2, width - 80, 
           height); 

//CGRect warningRect = CGRectMake(borderX, 
//       borderY * height * 3.0 + paddingY *3.0, 
//       width, height); 
CGRect warningRect = CGRectMake(borderX, 175, width, 40); 

UILabel* usernameLabel = [[UILabel alloc] initWithFrame:usernameLabelRect]; 

usernameLabel.textAlignment = UITextAlignmentRight; 
usernameLabel.font = font; 
usernameLabel.text = @"Username:"; 

UILabel* passwordLabel = [[UILabel alloc] initWithFrame:passwordLabelRect]; 
passwordLabel.textAlignment = UITextAlignmentRight; 
passwordLabel.font = font; 
passwordLabel.text = @"Password:"; 


usernameField = [[UITextField alloc] initWithFrame:usernameFieldRect]; 
[usernameField setBorderStyle:UITextBorderStyleRoundedRect]; 
//[usernameField setPlaceholder:@"<Username>"]; 
usernameField.font = font; 
usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; 
usernameField.autocorrectionType = UITextAutocorrectionTypeNo; 

passwordField = [[UITextField alloc] initWithFrame:passwordFieldRect]; 
passwordField.font = font; 
[passwordField setBorderStyle:UITextBorderStyleRoundedRect]; 
//[passwordField setPlaceholder:@"<Password>"]; 
passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; 
passwordField.autocorrectionType = UITextAutocorrectionTypeNo; 
passwordField.secureTextEntry = YES; 

loginButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
loginButton.frame = loginButtonRect; 
[loginButton setTitle: @"Einloggen" forState:UIControlStateNormal]; 
[loginButton setTitleColor:[UIColor blackColor] 
            forState:UIControlEventTouchDown]; 
loginButton.contentVerticalAlignment = 
            UIControlContentVerticalAlignmentCenter; 
loginButton.contentHorizontalAlignment = 
            UIControlContentHorizontalAlignmentCenter; 
[loginButton addTarget:self action:@selector(OnLoginClicked:) 
          forControlEvents:UIControlEventTouchUpInside]; 
[loginButton setBackgroundColor:[UIColor clearColor]]; 

warningLabel = [[UILabel alloc] initWithFrame:warningRect]; 
warningLabel.font = font; 
warningLabel.numberOfLines = 3; 
warningLabel.text = 
@"Wenn Sie die Applikation jetzt schließen, so werden Ihre Logindaten verworfen."; 

[myView addSubview:usernameLabel]; 
[myView addSubview:passwordLabel]; 
[myView addSubview:usernameField]; 
[myView addSubview:passwordField]; 
[myView addSubview:loginButton]; 
[myView addSubview:warningLabel]; 
/* 
[usernameLabel release]; 
[passwordLabel release]; 
[usernameField release]; 
[passwordField release]; 
[loginButton release]; 
[warningLabel release]; 
*/ 
self.view = myView; 
[myView release]; 
} 
+0

ici est une autre capture d'écran: http://uppix.net/b/f/2/a5993440c07753b851701068330be.png Comme vous pouvez le voir, le bouton "Einloggen" n'a aucun bouton montré dans ce cas. Habituellement, il a. Vous pouvez également voir l'espace réservé du nom d'utilisateur-Label pour afficher la "bordure" à la place de son espace réservé réel – Tomen

+0

L'écran de connexion que vous avez publié est un excellent exemple de l'utilisation d'Interface Builder. Vous ne faites que placer des contrôles et paramétrer beaucoup de propriétés qui auraient pu être traitées par Interface Builder. Faire un Xib séparé pour la vue de connexion et le charger au besoin, est la voie à suivre. La configuration de votre vue dans le code est source d'erreurs et beaucoup plus visuelle. Il est plus facile de repérer les problèmes en raison des chevauchements des commandes et autres. Pourquoi avez-vous besoin de configurer ceci en code? –

Répondre

0

Le problème était que j'ai appelé les messages UIKit de Not-The-Main-Thread, ce qui provoque toutes sortes de problèmes graphiques. Résolu en utilisant performSelectorOnMainThread: en plusieurs endroits dans mon code =)

1

Je ne peux pas travailler tout votre positionnement de l'écran dans ma tête, mais il me semble que beaucoup de vos champs se chevauchent: est-ce intentionnel ? Peut-être que c'est la cause? Je crée normalement des vues dans le code, mais cela pourrait être un cas pour IB! Vous n'avez pas montré de code pour la vue tabulaire, mais j'ai déjà rencontré des problèmes similaires avant d'ajouter des sous-vues à une cellule, puis la prochaine fois que la cellule est désintégrée avec DequeueReusableCell, vous ajoutez à nouveau les sous-vues sans vérifier là ou les effacer. Cela entraîne toutes sortes de chevauchements, tout comme la première capture d'écran.

Questions connexes