在iOS上使用屏幕键盘定位子类UIAlertView窗口

时间:2010-11-15 13:29:24

标签: iphone iphone-sdk-3.0 ios4 uialertview

我正在使用子类UIAlertView窗口作为我的应用程序中的登录提示(我知道它违反Apple指南,但它不会提交给appstore,所以这不是问题)。

添加文本字段并在屏幕上定位窗口的代码如下所示:

- (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 个答案:

答案 0 :(得分:2)

由于iOS 4已经针对较新的设备发布(iOS 4.2 for iPad即将推出),我建议将Base SDK设置为最新版本的iOS 4,并使用此版本编译您的应用程序。但是,如果您希望您的应用程序可供原始iPhone和iPod Touch用户使用,则有条件地使用setTransform方法是最好的方法。

答案 1 :(得分: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);

}