简体   繁体   中英

Several UITextFields in a UIScrollView, covered by the keyboard

I have several UITextFields in a UIScrollView . When I edit one of them and the keyboard pops-up, the field is covered by the keyboard.

I would like to scroll up the view, I thought this was automatically done by iOS but it seems not to be the case.

I'm currently using this method to scroll the view, but it doesn't work very well.

- (void)scrollToView:(UIView *)view
{
    CGRect viewFrame = [[edit scrollView] convertRect:[view frame] fromView:[view superview]];

    CGRect finalFrame = CGRectMake(viewFrame.origin.x, viewFrame.origin.y, viewFrame.size.width, (viewFrame.size.height + (inputAccessory.frame.size.height) + 4.0));

    [[edit scrollView] scrollRectToVisible:finalFrame animated:YES];
}

thanks

In my case, what I do is reduce the size of the scrollView in the Editing Did Begin event of the UITextField , like this:

- (IBAction)didEnterInTextField:(id)sender
{
    [sender becomeFirstResponder];
    // Resize the scroll view to reduce the keyboard height
    CGRect scrollViewFrame = self.scrollView.frame;
    if (scrollViewFrame.size.height > 300) {
        scrollViewFrame.size.height -= 216;
        self.scrollView.frame = scrollViewFrame;
    }

    // Scroll the view to see the text field
    UITextField *selectedTextField = (UITextField *)sender;
    float yPosition = selectedTextField.frame.origin.y - 60;
    float bottomPositon = self.scrollView.contentSize.height - self.scrollView.bounds.size.height;
    if (yPosition > bottomPositon) {
        yPosition = bottomPositon;
    }
    [self.scrollView setContentOffset:CGPointMake(0, yPosition) animated:YES];
}

Try this sample code TPKeyboardAvoiding

Its easy to implement. Just drag and drog the custom classes and change the Custom class from UIScrollview to TPKeyboardAvoidingScrollView in the xib

// register for keyboard notifications

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

set the frame of scroll view in these two methods.. when keyboards shows or hides.

or set the scrollRectToVisible of scroll view

- (void)scrollViewToCenterOfScreen:(UIView *)theView
{
    CGFloat viewCenterY = theView.center.y;
    CGFloat availableHeight;
    CGFloat y;

    if(!isReturned)
    {
        if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
        {
            availableHeight = 1080;
        }
        else
        {
            availableHeight = 220;
        }
    }
    else
    {
        if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
        {
            availableHeight = 1400;
        }
        else
        {
            availableHeight = 530;
        }

    }

    y = viewCenterY - availableHeight / 2.0;
    if (y < 0) {
        y = 0;
    }
    [sclView setContentOffset:CGPointMake(0, y) animated:YES];
}

Call this method in textfield or textview begin editing.It will works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM