簡體   English   中英

當鍵盤出現在iOS中時啟用滾動內容

[英]Enable scrolling content when keyboard appears in iOS

我在iPhone上有一個應用程序,該應用程序在viewcontroller中有很多內容。 通常,主要內容是表格。 我的問題是我舉起鍵盤並想輸入一些值來形成字段,許多內容是不可見的。 我想在出現鍵盤時滾動此內容。 我怎樣才能做到這一點? 我的視圖沒有滾動視圖,但是我嘗試這樣做,但是它不起作用。

到目前為止,我發現的所有提示都與如何放置用過的文本框有關,但這不是我的假設。

這就是我所做的,當鍵盤像這樣向上和向下升降時,我更改了最大約束條件-

viewDidLoad調用此方法-

   [self observeKeyboard];
#pragma mark- Keyboard Listen Methods
- (void)observeKeyboard {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillChangeFrameNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}


- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect keyboardFrame = [kbFrame CGRectValue];
CGFloat height = keyboardFrame.size.height;
self.COnstraintTopViewVertical.constant=(value of constant)-height;
[UIView animateWithDuration:animationDuration animations:^{
    [self.view layoutIfNeeded];
}];
}

- (void)keyboardWillHide:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
self.ConstraintTopViewVertical.constant=reset value;
[UIView animateWithDuration:animationDuration animations:^{
    [self.view layoutIfNeeded];
}];
}

您可以使用以下代碼以編程方式在鍵盤出現時更改視圖中的位置:

func keyboardWasShown(notification: NSNotification) {

    UIView.animateWithDuration(0.3, animations: { () -> Void in
        self.setContentOffset(CGPoint(x: setXOffsetHere, y: setYOffsetHere), animated: true)
    })
}

此代碼將在鍵盤出現后將視圖轉換為您在.setContentOffset調用中指定的坐標。 您仍然必須獲取坐標,但通常從情節提要中獲取坐標非常簡單。

  1. 將所有視圖放入滾動視圖
  2. 從滾動視圖的底部到超級視圖的底部設置自動布局約束
  3. viewWillAppear

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; 
  4. 處理知識庫文章通知

     - (void)keyboardWillChangeFrame:(NSNotification*)aNotification { CGRect kbFrame = [aNotification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect kbWindowIntersectionFrame = CGRectIntersection(self.view.window.bounds, kbFrame); [UIView animateWithDuration:[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] animations:^{ self.scrollVBottomConstraint.constant = kbWindowIntersectionFrame.size.height; [self.view layoutIfNeeded]; }]; } 
what i got from your question is: you are using textfield on UIView which is not on the scrollview, now you have to scroll the UIView when keyboard appears. just do following stuff.
-Give the tag to your textfield.
-suppose tag you have given is 4545646
-do not forgot to assign delegate to your textfield (it will execute below delegate method when you start to edit)
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (textField.tag == 4545646) {
        UIView *contanerView = [self.view viewWithTag:5556466];
        [UIView animateWithDuration:0.5 animations:^{
            contanerView.frame = CGRectMake(self.view.frame.origin.x+1, -85, self.view.frame.size.width, self.view.frame.size.height-9);
        }];
    }
}
Change the frame as per your requirement.
and 
- (void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField.tag == 4545646) {
        [textField resignFirstResponder];
        UIView *contanerView = [self.view viewWithTag:5556466];
        [UIView animateWithDuration:0.5 animations:^{
            contanerView.frame = CGRectMake(self.view.frame.origin.x+1, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
        }];
}

在viewDidAppear中添加以下通知

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

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

並在keyBoardShown方法中獲取鍵盤高度

 - (void)keyBoardShown:(NSNotification*)notification
{
    if(self.view.frame.origin.y>=0)
    {
        NSDictionary* keyboardInfo = [notification userInfo];
        NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
        CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];

        //    NSLog(@"hihi : %f",keyboardFrameBeginRect.size.height);

        keyBoardHeight = keyboardFrameBeginRect.size.height-yDeault+50;


        if (keyBoardHeight>0) {
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:0.5];

            [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
            self.view.frame = CGRectMake(self.view.frame.origin.x, (self.view.frame.origin.y-keyBoardHeight), self.view.frame.size.width, self.view.frame.size.height);
            [UIView commitAnimations];
        }


    }
}

在keyBoardDismiss中將主視圖y坐標設置為先前值

-(void)keyBoardDismiss:(NSNotification*)notification{
    if(self.view.frame.origin.y<0){
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];

        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        self.view.frame = CGRectMake(self.view.frame.origin.x, (self.view.frame.origin.y+keyBoardHeight), self.view.frame.size.width, self.view.frame.size.height);
        [UIView commitAnimations];
    }
}

這里yDeault是文本字段y坐標值

 yDeault= screenHeight-textField.frame.origin.y+textField.frame.size.height;

一旦顯示了鍵盤,主視圖將被向上移動,而一旦取消鍵盤,主視圖將被移回到原始位置。

好。 我做到了 我只需要添加滾動視圖,但是在我的應用程序中可能必須重構所有視圖。

無需添加scrollview。 您可以直接執行此操作。 您可以更改self.view.frame無需滾動型的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM