Скользящее UITextField на iPad, когда клавиатура показывает - PullRequest
0 голосов
/ 24 мая 2011

У меня есть код от Cocoa with Love, который прокручивает UITextField, когда клавиатура подходит, чтобы клавиатура не закрывала UITextField.

Вот код:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
    CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];

    CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;

    // Issue is that numerator isn't big enough for bottom 3rd of the screen

    CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height;

    CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height;

    CGFloat heightFraction = numerator / denominator;

    NSLog(@"Midline: %g Fraction: %g / %g", midline, numerator, denominator);

    if (heightFraction < 0.0)
    {
        heightFraction = 0.0;
    }
    else if (heightFraction > 1.0)
    {
        heightFraction = 1.0;
    }

    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
    }
    else
    {
        animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
    }

    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y -= animatedDistance;


    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];

    [self.view setFrame:viewFrame];

    [UIView commitAnimations];
}

В целях отладки я вывел среднюю линию и т. Д., Чтобы увидеть, что происходит. Это от вкладок сверху вниз. Вы можете видеть, что шестое число вниз по числителю становится отрицательным, потому что значение UITExtField.size.height, преобразованное для родительского представления, является низким числом. Я не могу понять, почему число будет отрицательным. Высота должна увеличиваться так же, как и все остальные, когда вы опускаетесь вниз.

2011-05-24 09: 36: 08.600 Baby Bloom [27794: 207] Средняя линия = 246 + 0,5 * 167

2011-05-24 09: 36: 08.601 Baby Bloom [27794: 207] Средняя линия: 329,5 Фракция: 22,3 / 409,6

2011-05-24 09: 36: 09.535 Baby Bloom [27794: 207] Средняя линия = 246 + 0,5 * 167

2011-05-24 09: 36: 09.536 Baby Bloom [27794: 207] Средняя линия: 329,5 Фракция: 22,3 / 409,6

2011-05-24 09: 36: 09.929 Baby Bloom [27794: 207] Средняя линия = 246 + 0,5 * 246

2011-05-24 09: 36: 09.930 Baby Bloom [27794: 207] Средняя линия: 369 Фракция: 61,8 / 409,6

2011-05-24 09: 36: 10.313 Baby Bloom [27794: 207] Средняя линия = 246 + 0,5 * 246

2011-05-24 09: 36: 10.314 Baby Bloom [27794: 207] Средняя линия: 369 Фракция: 61,8 / 409,6

2011-05-24 09: 36: 10.793 Baby Bloom [27794: 207] Средняя линия = 246 + 0,5 * 97

2011-05-24 09: 36: 10.794 Baby Bloom [27794: 207] Средняя линия: 294,5 Фракция: -12,7 / 409,6

2011-05-24 09: 36: 11.785 Baby Bloom [27794: 207] Средняя линия = 246 + 0,5 * 148

2011-05-24 09: 36: 11.786 Baby Bloom [27794: 207] Средняя линия: 320 Фракция: 12,8 / 409,6

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Оказывается, что когда в альбоме Landscape на iPad он переключает источник (x теперь у, а ширина теперь высота.

Вот код, чтобы заставить его работать:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
    CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];

    float origin;
    float textFieldHeight;
    float viewOrigin;
    float viewHeight;

    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];


    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        textFieldHeight = textFieldRect.size.height;
        origin = textFieldRect.origin.y;
        viewOrigin = viewRect.origin.y;
        viewHeight = viewRect.size.height;
    }
    else
    {
        textFieldHeight = textFieldRect.size.width;
        viewOrigin = viewRect.origin.x;
        viewHeight = viewRect.size.width;
        origin = viewHeight - textFieldRect.origin.x;
    }


    CGFloat midline = origin + 0.5 * textFieldHeight;

    // Take the current middle y location of the textfield
    // If it is in the top 20% of the view don't move it
    // If it is in the middle 60% move it by a fraction of the keyboard size
    // If it is in the bottom 20% move it by the whole size of the keyboard


    CGFloat numerator = midline - viewOrigin - MINIMUM_SCROLL_FRACTION * viewHeight;

    CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewHeight;

    CGFloat heightFraction = numerator / denominator;


    if (heightFraction < 0.0)
    {
        heightFraction = 0.0;
    }
    else if (heightFraction > 1.0)
    {
        heightFraction = 1.0;
    }

    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
    }
    else
    {
        animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
    }



    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y -= animatedDistance;

    //NSLog(@"Denom: %g", denominator);
    //NSLog(@"Distance: %g", animatedDistance);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];

    [self.view setFrame:viewFrame];

    [UIView commitAnimations];
}
1 голос
/ 15 августа 2011
origin = viewHeight - textFieldRect.origin.x;

Я думаю, вам это не нужно, потому что это приводит к неправильному началу поля и очень большому среднему значению, которые выполняют прокрутку там, где это не нужно.Так что обычно вы должны просто использовать x origin как y.

origin = textFieldRect.origin.x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...