图形错误,同时以编程方式创建UILabel,UITextField等

我以编程方式创建了一个登录视图和一个表视图。

在某些我无法复制的情况下,会出现一些奇怪的视觉错误:

  • 具有与其他字体不同的字母的文本
  • 一个按钮的边框最初没有显示,但只有当你点击它。 在相同的情况下,按钮的边框可以显示在UITextField中,而不是占位符(请参见屏幕截图)
  • 一个标签显示不在正确的位置,但在上面提到的文本框中,倒过来(我没有设法截图这个)
  • 下面,我添加了两个屏幕截图,其中大部分应用程序都已停用,仅显示错误:

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

    在这里你可以看到文本混合了不同的字体大小。

    这种错误不会定期发生或可以重现。

    我添加了以下登录屏幕的代码:

     // 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];
    }
    

    我无法将所有屏幕定位在我的脑海中,但它在我看来像许多场地重叠:这是故意的吗? 也许这是原因? 我通常在代码中创建视图,但这可能是IB的一种情况!

    您没有为表格视图显示任何代码,但是在将子视图添加到单元格之前,我看起来类似的问题,然后下一次使用DequeueReusableCell对单元格进行清除时,您再次添加子视图而不检查它们是否存在或清除它们。 这会导致各种重叠,就像第一个截图一样。


    问题是我从Not-The-Main-Thread调用UIKit消息,这会导致各种图形问题。 解决它通过使用performSelectorOnMainThread:在我的代码中的几个地方=)

    链接地址: http://www.djcxy.com/p/81935.html

    上一篇: Graphical Bugs while programmatically creating UILabel, UITextField, etc

    下一篇: How to draw text in trapezoid (or circle)?