У меня есть код от 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