IOS / Xcode:键盘出现时如何向上移动查看

时间:2015-09-03 18:25:14

标签: ios xcode keyboard textfield

关于这个问题有很多答案,但大多数都来自几年前,似乎没有一个令人满意。

对于只有三个文本字段和提交按钮的登录屏幕,我希望当键盘显示得足够时,视图会向上移动,这样当字段未被隐藏时,它也不会向上移出视图。所需的移动量使得提交按钮在键盘上方固定的距离。虽然可以通过在页面上向上移动字段来为键盘留出空间,但提交按钮仍然是隐藏的

我尝试添加以下内容:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField:textField up:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField:textField up:NO];
}

-(void)animateTextField:(UITextField*)textField up:(BOOL)up
{
    const int movementDistance = -200; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? movementDistance : -movementDistance);

    [UIView beginAnimations: @"animateTextField" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

这会将视图向上移动一个固定的数量,但是这些字段对于编辑是不可见的,即它们太高了。

另一个答案建议:

Browser("CreationTime:=1").GetROProperty("OpenURL")

我无法弄清楚如何实现这一点。如果你只是离开它,没有任何反应。我猜你应该用文本域的名称重命名文本字段,但在这种情况下,你会为​​每个文本字段做吗?我无法让它产生任何影响。

另一个建议是使用TPKeyboardAvoiding等类别,但这需要一个我不需要的滚动视图。

2015年这个问题没有直接的解决方案吗?

感谢您的任何建议/指导。

3 个答案:

答案 0 :(得分:9)

以下动画将在用户开始输入时将您的视图(在本例中为viewForLogin)移动200像素。当文本字段结束编辑时,视图将动画回原始位置。不要忘记设置文本字段的代理。

Swift 3

func textFieldDidBeginEditing(_ textField: UITextField) {
    UIView.animate(withDuration: 0.3, animations: {
        self.view.frame = CGRect(x:self.view.frame.origin.x, y:self.view.frame.origin.y - 200, width:self.view.frame.size.width, height:self.view.frame.size.height);

    })
}

func textFieldDidEndEditing(_ textField: UITextField) {
    UIView.animate(withDuration: 0.3, animations: {
        self.viewSupport.frame = CGRect(x:self.viewSupport.frame.origin.x, y:self.viewSupport.frame.origin.y + 200, width:self.viewSupport.frame.size.width, height:self.viewSupport.frame.size.height);

    })
}

<强>目标C

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.3];
    [UIView setAnimationBeginsFromCurrentState:TRUE];
    self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y -200., self.view.frame.size.width, self.view.frame.size.height);

    [UIView commitAnimations];


}


-(void)textFieldDidEndEditing:(UITextField *)textField
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.3];
    [UIView setAnimationBeginsFromCurrentState:TRUE];
    self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y +200., self.view.frame.size.width, self.view.frame.size.height);

    [UIView commitAnimations];

}

答案 1 :(得分:5)

SWIFT 爱好者 干得好。不过,我已经将这段代码与UIView一起使用了。您应该能够对scrollview进行这些调整。

    func addKeyboardNotifications() {
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(keyboardWillShow(notification:)),
                                               name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(keyboardWillHide(notification:)),
                                               name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func keyboardWillShow(notification: NSNotification) {

        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
// if using constraints            
// bottomViewBottomSpaceConstraint.constant = keyboardSize.height
self.view.frame.origin.y -= keyboardSize.height
            UIView.animate(withDuration: duration) {
                self.view.layoutIfNeeded()
            }
        }
    }
    func keyboardWillHide(notification: NSNotification) {

        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
//if using constraint
//        bottomViewBottomSpaceConstraint.constant = 0
self.view.frame.origin.y = 0
        UIView.animate(withDuration: duration) {
            self.view.layoutIfNeeded()
        }
    }

不要忘记在正确的位置删除通知。

func removeKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

答案 2 :(得分:2)

#define DEVICE_HEIGHT [[UIScreen mainScreen] bounds].size.height       
 -(void)viewDidLoad {

            [super viewDidLoad];

         // register for keyboard notifications

            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(keyboardWillShow:)
                                                         name:UIKeyboardWillShowNotification
                                                       object:self.view.window];

            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(keyboardWillHide:)
                                                         name:UIKeyboardWillHideNotification
                                                       object:self.view.window];

        }

        -(void)viewWillDisappear:(BOOL)animated

        {

        [super viewWillDisappear:animated];
            // unregister for keyboard notifications while not visible.

            [[NSNotificationCenter defaultCenter] removeObserver:self
                                                            name:UIKeyboardWillShowNotification
                                                          object:self.view.window];

            [[NSNotificationCenter defaultCenter] removeObserver:self
                                                            name:UIKeyboardWillHideNotification
                                                          object:self.view.window];
        }

    -(void)keyboardWillShow:(NSNotification *)noti

     {

        NSDictionary* userInfo = [noti userInfo];
        CGRect keyboardRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]   
        CGRectValue];
        keyboardRect = [self.view convertRect:keyboardRect fromView:nil];

        CGRect viewFrame = self.view.frame;
        viewFrame.size.height = DEVICE_HEIGHT - CGRectGetHeight(keyboardRect);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.1];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.view.frame = viewFrame;

        CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height  
                               - self.view.bounds.size.height);
        [self.scrollView setContentOffset:bottomOffset animated:NO];

        [UIView commitAnimations];

    }

    -(void)keyboardWillHide:(NSNotification *)noti

     {

        NSDictionary* userInfo = [noti userInfo];
        CGRect keyboardRect = [[userInfo 
                       objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];

        keyboardRect = [self.view convertRect:keyboardRect fromView:nil];

        CGRect viewFrame = self.view.frame;
        viewFrame.size.height = DEVICE_HEIGHT;

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.1];
        [UIView setAnimationBeginsFromCurrentState:YES];
        self.view.frame = viewFrame;
        [UIView commitAnimations];
    }