iOS scrollView setContentOffset shimmy

У меня есть scrollView с несколькими текстовыми полями, который отслеживает активное поле и обеспечивает его видимость, когда появляется клавиатура. Все это работает хорошо, но когда я переключаюсь с 3-го на 4-е текстовое поле, я немного поднимаюсь и опускаюсь «шимми», прежде чем текстовое поле оказывается в нужном месте. Какие-либо предложения?

-(void)keyboardDidShow:(NSNotification *)notification
{    
    if (keyboardIsShown)return;

    NSDictionary* info=[notification userInfo];
    // get keyboard size
    CGSize keyboardSize=[[info objectForKey:UIKeyboardFrameBeginUserInfoKey]CGRectValue].size;
    //Set scrollview insets to make room for keyboard
    UIEdgeInsets contentInsets=UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0);
    scrollView.contentInset=contentInsets;
    scrollView.scrollIndicatorInsets=contentInsets;

    //scroll the active text field into view
    CGRect viewFrame=self.view.frame;
    viewFrame.size.height-=keyboardSize.height;
    int fieldHeight=self.currentTextField.bounds.size.height;
    CGFloat navHeight=self.navigationController.navigationBar.frame.size.height;
    CGPoint viewPoint=CGPointMake(0.0, self.currentTextField.frame.origin.y+fieldHeight);

    if (!CGRectContainsPoint(viewFrame, viewPoint)) {
        //scroll to make sure active field is showing
        CGPoint scrollPoint=CGPointMake(0.0, viewPoint.y-keyboardSize.height+navHeight);//+navHeight
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

-(void)showActiveField
{    
    //this makes sure that activeField shows when selecting another field after initial keyboard show
    int fieldHeight=self.currentTextField.bounds.size.height;
    CGPoint viewPoint=CGPointMake(0.0, self.currentTextField.frame.origin.y+fieldHeight);
    CGRect viewFrame=self.view.frame;

    int inset=scrollView.contentInset.bottom;
    if (!CGRectContainsPoint(viewFrame, viewPoint)) {
        //scroll to make sure active field is showing
        CGPoint scrollPoint=CGPointMake(0.0, viewPoint.y-inset);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }    
}

person mflac    schedule 22.12.2011    source источник


Ответы (1)


Где вы устанавливаете keyboardIsShown? Разве вы не хотите сделать это сразу после того, как проверите, установлено ли оно уже?

И затем: находится ли 4-е поле ближе к концу прокрутки, и у вас установлена ​​прокрутка с отскоком?

person ott--    schedule 22.12.2011
comment
Я не использовал KeyboardIsShown, только KeyboardDidShow. На самом деле проблема не в KeyboardDidShow. Независимо от того, какое поле было нажато изначально, при появлении клавиатуры вид прокрутки плавно прокручивается до нужного места. Именно при последующем нажатии на 3-е поле происходит это заикание, переходя от 3-го к 4-му полю (которое является первым, скрытым клавиатурой, возникает заикание. Под ним есть еще одно поле, так что я не думаю это отскок. - person mflac; 23.12.2011
comment
Я просто добавил scrollView.bounces=NO;, но это не повлияло на эту проблему. - person mflac; 23.12.2011
comment
Ваш код говорит if (keyboardIsShown)return;. Где вы устанавливаете эту переменную? - person ott--; 23.12.2011