Scroll view issues when key board moves up in UIte

2019-07-31 07:54发布

问题:

I have a scrollview on my view in that i have all the sub views as shown bellow

UIView

  Scroll View

          1.ImageView
          2.Table view
          3.Text View

√√ To move the scroll view when keyboard appears / dismiss I have implemented logic in textview delegate metods as follows √√

- (void)textViewDidBeginEditing:(UITextView *)textView;
{
      //To move the view down 
      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDelegate:self];
      [UIView setAnimationDuration:0.3];
      [UIView setAnimationBeginsFromCurrentState:YES];
      scrollView.frame = CGRectMake(scrollView.frame.origin.x, (scrollView.frame.origin.y - 120), scrollView.frame.size.width, scrollView.frame.size.height);
      [UIView commitAnimations];

}


- (void)textViewDidEndEditing:(UITextView *)textView 
{   
      //To move the view down 
      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDelegate:self];
      [UIView setAnimationDuration:0.3];
      [UIView setAnimationBeginsFromCurrentState:YES];
      scrollView.frame = CGRectMake(scrollView.frame.origin.x, (scrollView.frame.origin.y + 120), scrollView.frame.size.width, scrollView.frame.size.height);
      [UIView commitAnimations];
}

√√ This method helps alot to move the view up/down with respcet to keyboard,

But here is the problem of scrolling.

User can not scroll all the view in presensec of key board. The view scrolls up to some position as follows, we can't see the picture / first column of table.

If the user want to show the first column / profile pic in presence of keyboard doesn't possible. how to fix theis issue.

回答1:

first set the scroll content like

scrollView.contentSize=CGSizeMake(320, 600);

and then animate there content when textView delegate method is called like

- (void)textViewDidBeginEditing:(UITextView *)textView;
{  
  [scrollView setContentOffset:CGPointMake(0, 120 ) animated:YES]; 
}

- (void)textViewDidEndEditing:(UITextView *)textView 
{
 [scrollView setContentOffset:CGPointMake(0, 0 ) animated:YES]; 
}


回答2:

First of all, you don't want to use the textViewDidBeginEditing: method to show/hide the keyboard. You should register for the appropriate notifications to do so. This could be placed in your viewDidLoad.

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

Then if the keyboard is shown, make sure to not move your entire scroll view but shrink it's size.

- (void)keyboardWillShow:(NSNotification *)notif
{
    CGSize kbSize = [[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    double duration = [[[notif userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // Shrink the scroll view's content
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;

    // Scroll the text field to be visible (use own animation with keyboard's duration)
    CGRect textFieldRect = [_activeTextField convertRect:_activeTextField.bounds toView:self.scrollView];
    [UIView animateWithDuration:duration animations:^{
        [self.scrollView scrollRectToVisible:CGRectInset(textFieldRect, 0.0, -10.0) animated:NO];
    }];
}

This code has some additional functionality because I also had to move the content of the scroll view, but works to get you started. Then when the keyboard hides...

- (void)keyboardWillHide:(NSNotification *)notif
{
    double duration = [[[notif userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // Set content inset back to default with a nice little animation
    [UIView animateWithDuration:duration animations:^{
        UIEdgeInsets contentInsets = UIEdgeInsetsZero;
        self.scrollView.contentInset = contentInsets;
        self.scrollView.scrollIndicatorInsets = contentInsets;
    }];
}


回答3:

Apply content offset when keyboard is shown. And revert back when its hidden.

[scrollView setContentOffset:CGPointMake(0.0f, 120.0f) animated:YES];

After hiding the keyboard call.

[scrollView setContentOffset:CGPointZero animated:YES];


回答4:

Just Change The ContentOffset of ScrollView No need to change the origin of ScrollView as you were doing in your code doing so scrollview will always scroll. Doing so you need to set the ContentSize of upur ScrollViw atleast 550 just check what would be the Appropriate ContentSize. I have created a method in which you just need to call my method and pass required parameter appropriately

And One more Thing Set The ContentSIze Of UISCrollView More than the Height of It's SuperView at where you have created theScrollViewor inViewViewAppearmethod. (CurrentView)

  [contentScrollView setContentSize:CGSizeMake(320, 620)];

  And Call This Method As you click on TextField or on the Screen(In Touch Ended when you need to readjust ContentOffset)

  - (void)adjustContetOffset:(BOOL)yes withOffSet:(CGFloat)offSet
  {  

    contentOffSetY = offSet ;
     //By this you can track more suppose you have change the Orientation of Device then set Appropriate Offset.
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.4];

    if(yes){
        isScrolledUp = TRUE;
        contentScrollView.contentOffset = CGPointMake(0, contentOffSetY);
    }
    else
    {
        isScrolledUp = FALSE;
       //by this flag you can Track that OffSet of ScrollView has changed 
        contentScrollView.contentOffset = CGPointMake(0, contentOffSetY);
    }

    [UIView commitAnimations];

  }

    //this methods 'll call whenever you 'll touch the SCreen
  -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{


    if(isScrolledUp){
    [self adjustContetOffset:NO withOffSet: 0.0];
   }
    [searchTextField resignFirstResponder];
   }

I hope it'll helpful to you.