позиционирование подклассного окна UIAlertView с экранной клавиатурой на iOS - PullRequest
1 голос
/ 15 ноября 2010

Я использую субклассированное окно UIAlertView в качестве приглашения для входа в систему в моем приложении (я знаю, что это противоречит рекомендациям Apple, но оно не будет отправлено в магазин приложений, поэтому это не проблема).

Код для добавленияТекстовые поля и расположение окна на экране выглядит следующим образом:

- (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 ]

2 голосов
/ 15 ноября 2010

Поскольку iOS 4 была выпущена для более новых устройств (а iOS 4.2 для iPad уже не за горами), я бы порекомендовал установить Base SDK на последнюю версию iOS 4 и скомпилировать ваше приложение с этой версией.Однако, если вы хотите, чтобы ваше приложение было доступно оригинальным пользователям iPhone и iPod Touch, лучше всего использовать метод setTransform.

0 голосов
/ 15 ноября 2010

Все, что (текст) вы добавляете в 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);

}
...