为了账号安全,请及时绑定邮箱和手机立即绑定

当键盘出现时 - 如何开始编辑时,如何让UITextField向上移动?

当键盘出现时 - 如何开始编辑时,如何让UITextField向上移动?

iOS
Qyouu 2019-05-25 16:14:09
当键盘出现时 - 如何开始编辑时,如何让UITextField向上移动?使用iOS SDK:我有一个UIView带有UITextField键盘的s。我需要它能够:UIScrollView一旦键盘出现,允许滚动内容以查看其他文本字段自动“跳跃”(通过向上滚动)或缩短我知道我需要一个UIScrollView。我已经尝试将我的类更改UIView为a UIScrollView但我仍然无法向上或向下滚动文本框。我需要a UIView和a UIScrollView吗?一个人进去另一个吗?需要实现什么才能自动滚动到活动文本字段?理想情况下,尽可能多的组件设置将在Interface Builder中完成。我只想编写需要它的代码。注意:我正在使用的UIView(或UIScrollView)是由tabbar(UITabBar)启动的,它需要正常运行。编辑:我正在添加滚动条,仅用于键盘出现时。即使它不需要,我觉得它提供了更好的界面,因为用户可以滚动和更改文本框。我已经让它工作,我改变UIScrollView了键盘上下的框架大小。我只是使用:-(void)textFieldDidBeginEditing:(UITextField *)textField {      //Keyboard becomes visible     scrollView.frame = CGRectMake(scrollView.frame.origin.x,                       scrollView.frame.origin.y, scrollView.frame.size.width,scrollView.frame.size.height - 215 + 50);                         //resize}-(void)textFieldDidEndEditing:(UITextField *)textField {    //keyboard will hide     scrollView.frame = CGRectMake(scrollView.frame.origin.x,         scrollView.frame.origin.y,       scrollView.frame.size.width,       scrollView.frame.size.height + 215 - 50); //resize}但是,这不会自动“向上移动”或将可见区域中的下部文本字段居中,这是我真正想要的。
查看完整描述

4 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

实际上,最好只使用Apple的实现,如文档中所提供的那样。但是,他们提供的代码是错误的。将keyboardWasShown:评论下方的部分替换为以下内容:

NSDictionary* info = [aNotification userInfo];

CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view];

CGSize kbSize =keyPadFrame.size;

CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview];

CGRect aRect = self.view.bounds;

aRect.size.height -= (kbSize.height);


CGPoint origin =  activeRect.origin;

origin.y -= backScrollView.contentOffset.y;

if (!CGRectContainsPoint(aRect, origin)) {

    CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height));

    [backScrollView setContentOffset:scrollPoint animated:YES];

}

Apple代码的问题是这些:(1)它们总是计算点是否在视图的框架内,但它是a ScrollView,所以它可能已经滚动,你需要考虑该偏移:


origin.y -= scrollView.contentOffset.y

(2)他们将contentOffset移动键盘的高度,但我们想要相反(我们想要移动contentOffset屏幕上可见的高度,而不是不是):


activeField.frame.origin.y-(aRect.size.height)


查看完整回答
反对 回复 2019-05-25
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

textFieldDidBeginEdittingtextFieldDidEndEditing通话功能[self animateTextField:textField up:YES],如下所示:

-(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 = -130; // 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];}

我希望这段代码可以帮到你。

在Swift 2中

func animateTextField(textField: UITextField, up: Bool) {
     let movementDistance:CGFloat = -130
     let movementDuration: Double = 0.3

     var movement:CGFloat = 0
     if up 
     {
         movement = movementDistance     }
     else 
     {
         movement = -movementDistance     }
     UIView.beginAnimations("animateTextField", context: nil)
     UIView.setAnimationBeginsFromCurrentState(true)
     UIView.setAnimationDuration(movementDuration)
     self.view.frame = CGRectOffset(self.view.frame, 0, movement)
     UIView.commitAnimations()}func textFieldDidBeginEditing(textField: UITextField) {
    self.animateTextField(textField, up:true)}func textFieldDidEndEditing(textField: UITextField) {
    self.animateTextField(textField, up:false)}

SWIFT 3

 func animateTextField(textField: UITextField, up: Bool)
    {
        let movementDistance:CGFloat = -130
        let movementDuration: Double = 0.3

        var movement:CGFloat = 0
        if up        {
            movement = movementDistance        }
        else
        {
            movement = -movementDistance        }
        UIView.beginAnimations("animateTextField", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration)
        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
        UIView.commitAnimations()
    }


    func textFieldDidBeginEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:true)
    }

    func textFieldDidEndEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:false)
    }


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 674 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信