2010-11-15 42 views
1

我使用的子類UIAlertView中窗口在我的應用程序(我知道這是對蘋果的指導方針,但是,所以它不是一個問題,它不會被提交給AppStore的)登錄提示。定位子類UIAlertView中窗口,屏幕鍵盤上的iOS

添加文本字段和屏幕上的窗口位置的代碼看起來是這樣的:

- (id)initWithTitle:(NSString *)title delegate:(id)delegate 
{ 
    if (self = [super initWithTitle:title message:@"\n\n\n" delegate:delegate cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login", nil]) { 
     UITextField *loginTF = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 55.0, 260.0, 25.0)]; 
     // text field settings removed for code clarity 
     [self addSubview:loginTF]; 
     self.loginTextField = loginTF; 
     [loginTF release]; 

     UITextField *passwordTF = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 85.0, 260.0, 25.0)]; 
     // text field settings removed for code clarity 
     [self addSubview:passwordTF]; 
     self.passwordTextField = passwordTF; 
     [passwordTF release]; 

     CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 90.0); 
     [self setTransform:translate]; 
    } 

    return self; 
} 

問題是與setTransform電話:

在iOS 3.X:
- 無setTransform:窗口在屏幕上水平和垂直居中顯示,屏幕上的鍵盤部分顯示在屏幕上方 - 因此整個窗口不可見
- 與setTransform:窗口不顯示播放高出90個像素,因此在顯示屏幕鍵盤時可以看到整個屏幕。

上的iOS然而4.x的:
- 無setTransform:顯示窗口完全正常(可見屏幕上鍵盤以上)
- 與setTransform:被部分地顯示在屏幕的頂部邊界上面的窗口(90像素太高)。

這個問題最好的解決方案是什麼?檢測iOS版本並有條件地調用setTransform?或者這太難看了,有更好的方法嗎?

回答

2

因爲iOS 4的已經發布的新設備(和iOS 4.2的iPad是對周圍的角落),我會建議基本SDK設置爲iOS 4的最新版本,並編輯與此版本的應用程序。但是,如果您希望您的應用程序可用於原始iPhone和iPod Touch用戶,則有條件地使用setTransform方法是最好的方法。

+0

我真的很喜歡這個應用程序可用於儘可能廣泛的iOS設備。這就是爲什麼我要爲iOS3.x編譯它 - 那裏仍然有大量的iOS3設備。我想我會去接受有條件的'setTransform'調用。謝謝。 – grzaks 2010-11-15 13:40:58

0

無論您在UIAlertView中添加什麼(文本),都會顯示爲標籤。所以如果你想添加文本框,只需在所有標籤上添加文本框,然後向下移動標籤。這是我所做的,

- (void) drawRect:(CGRect)rect { 
    [super drawRect:rect]; 

    CGRect labelFrame = CGRectMake(0, 0, 0, 0); // init if no label is there 
    NSArray *views = [self subviews]; 
    for (UIView *view in views){ 
     if ([view isKindOfClass:[UILabel class]]) { 
      labelFrame = view.frame; 
     } else {  
      view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y + kTextFieldHeight , view.frame.size.width, view.frame.size.height); 
     } 

    } 

    CGRect myFrame = self.frame; 
    self.textField.frame = CGRectMake(95, labelFrame.origin.y+labelFrame.size.height + 5.0, kTextFieldWidth, kTextFieldHeight); 
    self.frame = CGRectMake(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height + kTextFieldHeight); 

}