UIScrollView 中的几个 UITextField,被键盘覆盖

Posted

技术标签:

【中文标题】UIScrollView 中的几个 UITextField,被键盘覆盖【英文标题】:Several UITextFields in a UIScrollView, covered by the keyboard 【发布时间】:2013-01-07 12:06:23 【问题描述】:

我在UIScrollView 中有几个UITextFields。当我编辑其中一个并弹出键盘时,该字段被键盘覆盖。

我想向上滚动视图,我以为这是 ios 自动完成的,但似乎不是这样。

我目前正在使用这个方法来滚动视图,但是效果不是很好。

- (void)scrollToView:(UIView *)view

    CGRect viewFrame = [[edit scrollView] convertRect:[view frame] fromView:[view superview]];

    CGRect finalFrame = CGRectMake(viewFrame.origin.x, viewFrame.origin.y, viewFrame.size.width, (viewFrame.size.height + (inputAccessory.frame.size.height) + 4.0));

    [[edit scrollView] scrollRectToVisible:finalFrame animated:YES];

谢谢

【问题讨论】:

不能很好地工作。表示您面临什么问题? 【参考方案1】:

就我而言,我所做的是在Editing Did BeginEditing Did Begin 事件中减小scrollView 的大小UITextField,如下所示:

- (IBAction)didEnterInTextField:(id)sender

    [sender becomeFirstResponder];
    // Resize the scroll view to reduce the keyboard height
    CGRect scrollViewFrame = self.scrollView.frame;
    if (scrollViewFrame.size.height > 300) 
        scrollViewFrame.size.height -= 216;
        self.scrollView.frame = scrollViewFrame;
    

    // Scroll the view to see the text field
    UITextField *selectedTextField = (UITextField *)sender;
    float yPosition = selectedTextField.frame.origin.y - 60;
    float bottomPositon = self.scrollView.contentSize.height - self.scrollView.bounds.size.height;
    if (yPosition > bottomPositon) 
        yPosition = bottomPositon;
    
    [self.scrollView setContentOffset:CGPointMake(0, yPosition) animated:YES];

【讨论】:

【参考方案2】:

试试这个示例代码TPKeyboardAvoiding

它很容易实现。只需拖放自定义类并将自定义类从 UIScrollview 更改为 xib 中的TPKeyboardAvoidingScrollView

【讨论】:

【参考方案3】:

这是一个很好的教程

http://www.iphonesampleapps.com/2009/12/adjust-uitextfield-hidden-behind-keyboard-with-uiscrollview/

希望对你有帮助

【讨论】:

【参考方案4】:

// 注册键盘通知

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

在这两种方法中设置滚动视图的框架..当键盘显示或隐藏时。

或者设置滚动视图的scrollRectToVisible

【讨论】:

【参考方案5】:
- (void)scrollViewToCenterOfScreen:(UIView *)theView

    CGFloat viewCenterY = theView.center.y;
    CGFloat availableHeight;
    CGFloat y;

    if(!isReturned)
    
        if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
        
            availableHeight = 1080;
        
        else
        
            availableHeight = 220;
        
    
    else
    
        if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
        
            availableHeight = 1400;
        
        else
        
            availableHeight = 530;
        

    

    y = viewCenterY - availableHeight / 2.0;
    if (y < 0) 
        y = 0;
    
    [sclView setContentOffset:CGPointMake(0, y) animated:YES];

在 textfield 或 textview 中调用此方法开始编辑。它会起作用。

【讨论】:

以上是关于UIScrollView 中的几个 UITextField,被键盘覆盖的主要内容,如果未能解决你的问题,请参考以下文章

iOS 设计中关于UIScrollViewDelegate的几个代理方法的简单介绍

UI基础篇之UIScrollView

iOS:如何为 UIScrollView 设置约束

iOS之深度剖析UIScrollView的实现原理与阻尼动画

iOS scrollview不能滑动的几个原因及解决方法

切换uitextf时停止键盘关闭