SetFrame работает на iPhone, но не на iPad.Авто маска изменения размера виноват? - PullRequest
5 голосов
/ 18 сентября 2011

Я пытаюсь изменить размер UITextView, когда клавиатура показывает.На айфоне работает прекрасно.Когда система отправляет уведомление с клавиатуры, размер текстового представления изменяется.Когда редактирование завершено, я изменяю его размер, чтобы заполнить начальное пространство.(Да, я предполагаю, что клавиатура исчезла, когда редактирование прекращается. Я должен изменить это. Однако я не думаю, что это моя проблема.)

Когда я изменяю размер текстового представления на iPad, рамкаизменяет размер правильно, но приложение, похоже, сбрасывает значение Y кадра до нуля.Вот мой код:

- (void) keyboardDidShowWithNotification:(NSNotification *)aNotification{

//
//  If the content view being edited
//  then show shrink it to fit above the keyboard.
//

if ([self.contentTextView isFirstResponder]) {

    //
    //  Grab the keyboard size "meta data"
    //

    NSDictionary *info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    //
    //  Calculate the amount of the view that the keyboard hides.
    //
    //  Here we do some confusing math voodoo.
    //
    //  Get the bottom of the screen, subtract that 
    //  from the keyboard height, then take the 
    //  difference and set that as the bottom inset 
    //  of the content text view.
    //

    float screenHeightMinusBottom = self.contentTextView.frame.size.height + self.contentTextView.frame.origin.y;

    float heightOfBottom = self.view.frame.size.height - screenHeightMinusBottom;


    float insetAmount = kbSize.height - heightOfBottom;

    //
    //  Don't stretch the text to reach the keyboard if it's shorter.
    //

    if (insetAmount < 0) {
        return;
    }

    self.keyboardOverlapPortrait = insetAmount;

    float initialOriginX = self.contentTextView.frame.origin.x;
    float initialOriginY = self.contentTextView.frame.origin.y;

    [self.contentTextView setFrame:CGRectMake(initialOriginX, initialOriginY, self.contentTextView.frame.size.width, self.contentTextView.frame.size.height-insetAmount)];


}

Почему это работает на iPhone, а не на iPad?Кроме того, могут ли мои маски авторазмера вносить неожиданные изменения?

1 Ответ

3 голосов
/ 21 сентября 2011

Как сказал @bandejapaisa, я обнаружил, что ориентация была проблемой, по крайней мере, во время моих тестов.

Во-первых, использование kbSize.height вводит в заблуждение, поскольку в альбомной ориентации оно представляет ширину клавиатуры. Итак, поскольку ваш код находится в UIViewController, вы можете использовать его следующим образом:

float insetAmount = (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)?kbSize.height:kbSize.width) - heightOfBottom;

self.interfaceOrientation задает ориентацию интерфейса (может отличаться от ориентации устройства), а макрос UIInterfaceOrientationIsPortrait возвращает YES, если задана ориентация Portrait (вверху или внизу). Так как высота клавиатуры равна kbSize.height, когда интерфейс - Портрет, и kbSize.width, когда интерфейс - Пейзаж, нам просто нужно проверить ориентацию, чтобы получить правильное значение.

Но этого недостаточно, потому что я обнаружил ту же проблему со значением self.view.frame.size.height. Поэтому я использовал тот же обходной путь:

float heightOfBottom = (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)?self.view.frame.size.height:self.view.frame.size.width) - screenHeightMinusBottom;

Надеюсь, это поможет ...

...