如何使一个UIScrollView自动滚屏为UITextField成为第一个响应(How to ma

2019-08-01 21:23发布

我见过的帖子围绕此说认为, UIScrollViews如果一个子视图应自动滚动UITextField成为第一个响应者; 然而,我无法弄清楚如何得到这个工作。

我有一个UIViewController具有UIScrollView和内UIScrollView有多个文本框。

我知道如何在必要时手动执行此操作; 然而,从我一直在读什么,似乎可以拥有它自动滚屏。 请帮忙。

Answer 1:

我希望这个例子可以帮助你,你可以滚动到这段代码的任何一点。

scrollView.contentOffset = CGPointMake(0,0);

所以,如果你有文本框,它必须有一些X上的Y位置,所以你可以使用

CGPoint point = textfield.frame.origin ;
scrollView.contentOffset = point 

这应该做的伎俩,

但是,如果你不知道什么时候来调用这个代码,所以你应该学会UITextFieldDelegate方法

在你的代码实现此方法

- (void)textFieldDidBeginEditing:(UITextField *)textField {
// Place Scroll Code here
}

我希望你知道如何使用委托方法。



Answer 2:

我知道这个问题已经回答了,但我想我会分享代码组合,我从@Adeel和@Basil答案使用,因为它似乎完美地为我工作在iOS 9。

-(void)textFieldDidBeginEditing:(UITextField *)textField {

    // Scroll to the text field so that it is
    // not hidden by the keyboard during editing.
    [scroll setContentOffset:CGPointMake(0, (textField.superview.frame.origin.y + (textField.frame.origin.y))) animated:YES];
}

-(void)textFieldDidEndEditing:(UITextField *)textField {

    // Remove any content offset from the scroll
    // view otherwise the scroll view will look odd.
    [scroll setContentOffset:CGPointMake(0, 0) animated:YES];
}

我也用动画的方法,它使一个更平滑的过渡。



Answer 3:

还有什么是你必须做手工。 这是默认的行为。 有两种可能性,为什么你没有看到的行为

  1. 最可能的原因是,该键盘是覆盖你UITextField 。 请参阅下面的解决方案
  2. 另一种可能性是,你有其他UIScrollView中的视图层次某处UITextFieldUIScrollView要自动滚动。 这是不太可能,但仍可能会造成问题。

对于#1,要实现类似苹果的建议东西移动内容位于下键盘 。 需要注意的是由苹果提供的代码不占旋转。 有关他们的代码的改进,检查出这篇博客的贯彻keyboardDidShow ,使用窗口正确翻译键盘的框架方法。



Answer 4:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGRect rect = [textField bounds];
    rect = [textField convertRect:rect toView:self.scrollView];
    rect.origin.x = 0 ;
    rect.origin.y -= 60 ;
    rect.size.height = 400;

    [self.scrollView scrollRectToVisible:rect animated:YES];
}


Answer 5:

这里是斯威夫特4更新@ Supertecnoboff的答案。 这对我来说真是棒极了。

func textFieldDidBeginEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: (textField.superview?.frame.origin.y)!), animated: true)
}

func textFieldDidEndEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}

确保扩大UITextFieldDelegate和文本框委托设置为self。



Answer 6:

您可以使用此功能的UITextField的自动滚屏

UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField {

[self autoScrolTextField:textField onScrollView:self.scrollView];
}




- (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView { 
 float slidePoint = 0.0f;
float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f;
float textFieldButtomPoint = textField.superview.frame.origin.y + (textField.frame.origin.y + textField.frame.size.height);

if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) {
    slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f;
    CGPoint point = CGPointMake(0.0f, slidePoint);
    scrollView.contentOffset = point;
}

编辑:

林现在使用的IQKeyboardManager荣誉给这个开发商,你需要尝试这个。



Answer 7:

如果您有多个文本框说Textfield1Textfield2Textfield3 ,并要滚动沿y轴滚动视图时,文字栏成为第一个响应:

if([Textfield2 isFirstResponder])
{
    scrollView.contentOffset = CGPointMake(0,yourY);
} 


Answer 8:

正如迈克尔·麦圭尔在他的观点中提到#2以上时,系统的默认行为时,滚动视图包含文本字段和滚动视图之间的另一个滚动视图行为不端。 我发现,当有只对文本字段(包括嵌入在需要进行调整,以使文本字段进入视野时,文本字段要开始编辑滚动视图下一个滚动视图中的不当行为也会发生。这是iOS上的12.1。

但我的解决办法是与上述不同。 在我的顶层滚动视图,这是子类,所以我可以添加属性和方法的重写,我重写scrollRectToVisible:animated: 。 它只是简单地调用它的[super scrollRectToVisible:animated:]除非有一个属性集,告诉其调整rect传递,这是文本字段的帧。 当属性是非零,它是对一个参考UITextField的问题,而rect进行调整,使得滚动视图远远超出了该系统以为会。 所以我把这个在UIScrollView的子类的头文件:

@property (nullable) UITextField *textFieldToBringIntoView;

(具有适当的@synthesize textFieldToBringIntoView;在执行然后,我添加此覆盖方法来实现:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)how
{
    if (textFieldToBringIntoView) {
       // Do whatever mucking with `rect`'s origin needed to make it visible
       // based on context or its spatial relationship with the other
       // view that the system is getting confused by.

       textFieldToBringIntoView = nil;        // Go back to normal
       }
    [super scrollRectToVisible:rect animated:how];
}

在该委托方法UITextField的时候它要开始编辑,刚刚成立textFieldToBringIntoViewtextField的问题:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Ensure it scrolls into view so that keyboard doesn't obscure it
    // The system is about to call |scrollRectIntoView:| for the scrolling
    // superview, but the system doesn't get things right in certain cases.

    UIScrollView *parent = (UIScrollView *)textField.superview;
    // (or figure out the parent UIScrollView some other way)

    // Tell the override to do something special just once
    // based on this text field's position in its parent's scroll view.
    parent.textFieldToBringIntoView = textField;
    // The override function will set this back to nil

    return(YES);
}

它似乎工作。 而如果苹果修复了BUG,现在看来似乎仍然可以工作(手指交叉)。



文章来源: How to make a UIScrollView auto scroll when a UITextField becomes a first responder