使视图向上滑动以便为键盘腾出空间?

问题描述 投票:0回答:6

我刚刚开始学习 iPhone 应用程序编程,我似乎不知道如何在键盘出现时让视图滑开(这样你仍然可以看到你正在输入的文本字段)。是怎么做到的?

iphone objective-c cocoa-touch uikeyboard
6个回答
2
投票

如果视觉上没问题,最简单的就是移动整个 self.view.frame ,完成后再向下移动。

static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3f;

- (void) animateForToNewYPosition:(int)newYPosition {
    // move for kdb
    if (self.view.frame.origin.y == newYPosition) {
        return;
    }

    // start animation
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];  

    // move it
    self.view.frame.origin.y = newYPosition;

    [UIView commitAnimations];  
}

1
投票

一种方法是将所有内容包含在 UIScrollView 中,然后向上滚动内容。另一种方法是自己移动视图,通常借助核心动画来使其看起来更漂亮。

文档是一个很好的起点。甚至还有一个部分标记为移动位于键盘下的内容,它将为您指明正确的方向。


0
投票

假设您需要在标签为4的文本字段上上移视图(当您有超过1个txt字段并且其中一个被键盘覆盖时)然后使用textField委托方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField   
{
if(textField.tag==4)
    CGRect viewFrame;
    viewFrame=self.view.frame;
    if(viewFrame.origin.y==-100)
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:.3];
        viewFrame.origin.y+=100;
        self.view.frame=viewFrame;
        [UIView commitAnimations];
    }

}

这会改变你的观点。现在要向下移动,您需要在 textField 另一个委托方法中编写代码

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
   if(textField.tag==4)
{
 CGRect viewFrame;
    viewFrame=self.view.frame;
    if(viewFrame.origin.y==-100)
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:.3];
        viewFrame.origin.y+=100;
        self.view.frame=viewFrame;
        [UIView commitAnimations];
    }
}
}

如果是文本视图,您需要一个按钮,而要向上移动视图,您需要这个委托

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView

并使用与textField相同的代码

向下移动,您需要在导航栏中添加一个按钮,或者添加到工具栏中,并通过相同的动画在键盘上设置该工具栏。对于按钮,您需要相同的代码来向下移动,这适用于文本字段。

希望这对您有帮助。


0
投票

我发现使用键盘通知比使用 textFieldDidBeginEditing 和 textFieldDidEndEditing 的 UITextField 委托协议更适合我的应用程序。通知是keyboardWillShow 和keyboardWillHide。可以测试 UITextField 或 UITextView 是否需要视图随这些通知移动,然后有条件地移动视图。我的应用程序的优点是我有很多 UITextTield,并且当编辑从一个字段移动到另一个字段时,通知可以更轻松地将视图保持在键盘上方。


0
投票
  http://objectivecwithsuraj.blogspot.in/2012/06/making-view-slide-up-to-make-room-for.html

  Add a UIScrollview - scrollview to your UIView and set delegates for UITextFields & 
     UIScrollview

  - (BOOL)textFieldShouldReturn:(UITextField *)textField 
  {
     if (textField == txtFieldName)
   {
         [txtFieldCellNo becomeFirstResponder];
   }
   else if (textField == txtFieldCellNo)
   {
         [txtFieldEmail becomeFirstResponder];
   }
   else
  {
       [textField resignFirstResponder];

  }
return YES;
}

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


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


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; 
    const float movementDuration = 0.3f;
    int movement = (up ? -movementDistance : movementDistance);
    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame,0, movement);
    [UIView commitAnimations];

}


0
投票

使用 iOS 15 或更高版本时,您可以使用

keyboardLayoutGuide
UIView
属性。

布局约束示例,将 myView 置于屏幕键盘顶部:

myView.bottomAnchor.constraint(equalTo: view.keyboardLayoutGuide.topAnchor)

更多信息和示例代码可以在这里找到:https://developer.apple.com/documentation/uikit/keyboards_and_input/ adjustment_your_layout_with_keyboard_layout_guide

© www.soinside.com 2019 - 2024. All rights reserved.