为什么ScrollToRect不适用于ScrollView内的Tableview内的TextField?

时间:2016-08-31 20:26:03

标签: ios uitableview xamarin.ios uikeyboard

我知道这有点讨厌,技术上不推荐,但我在ScrollView里面的UITableView(当然)里面有一个UITableViewCell,在另一个视图里面。

这是层次结构

View
=> ScrollView
    => TableView (also a scrollview)
        => Cell
            => TextField

目前,我在控制器中有一些代码用于在ScrollView内部激活TextField时滚动屏幕的顶视图。看起来像这样:

/// <summary>
/// Event fired when keyboard is popping up
/// Prevents keyboard from hiding selected text fields
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void ShowCallback(object sender, UIKeyboardEventArgs args)
{
    var currentStep = steps[currentIndex];

    // Get the size of the keyboard
    CGRect keyboardBounds = args.FrameEnd;
    nfloat bottomGap = View.Frame.Bottom - currentView.Frame.Bottom;
    // Create an inset and assign it to the tableview
    UIEdgeInsets originalInsets = currentStep.ScrollView.ContentInset;
    UIEdgeInsets contentInsets = new UIEdgeInsets(originalInsets.Top, 0.0f, keyboardBounds.Size.Height - bottomGap, 0.0f);
    currentStep.ScrollView.DelaysContentTouches = false;
    currentStep.ScrollView.ContentInset = contentInsets;
    currentStep.ScrollView.ScrollIndicatorInsets = contentInsets;
    UITextField tf = currentStep.GetActiveTextfield(currentView);
    if (tf != null)
    {
        currentStep.ScrollView.ScrollRectToVisible(tf, true);
    }


}

这适用于ScrollView中的TextFields,但不适用于TableView中的TextFields。 “tf”不是null,所以它肯定得到了值,但ScrollView没有让步,我仍然有隐藏的文本域问题。

我花了很多时间修复键盘隐藏我的内容的问题。我希望Apple有一个内置的简单解决方案。

2 个答案:

答案 0 :(得分:1)

Apple内置的简单解决方案:)

实际上有一个滚动要显示的单元格的功能!在Swift中,它看起来像:

self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)

因此,使用此解决方案,只需获取UITextField的单元格,并要求您的表格视图滚动到该单元格。

替代答案

<强>问题

UITextField's帧相对于其超级视图,即单元格。在这种情况下,文本字段可能包含CGRect(x:0, y:0, width: cell.frame.size.width, height:cell.frame.size.height)这样的框架,因此当您致电ScrollRectToVisible时,scrollView不会移动。

<强>解决方案

要解决此问题,请改为调用单元格框架上的ScrollRectToVisible,例如:

UITextField tf = currentStep.GetActiveTextfield(currentView);
UIView v = tf.superView;
if (v != null) {
    currentStep.ScrollView.ScrollRectToVisible(v, true);
}
  

我不习惯xamarin,所以请更正您看到的任何格式或错误!

答案 1 :(得分:0)

转换子视图的子视图的矩形

Carter的回答让我开始了,但我需要做的是使用ConvertRectFromView获取与顶级ScrollView相关的TextField的坐标:

CGRect frame = currentStep.ScrollView.ConvertRectFromView(tf.Frame, tf.Superview);

currentStep.ScrollView.ScrollRectToVisible(frame, true);

这给了我在scrollview中的TextField的位置,而不是Cell中的坐标。此添加后滚动按预期工作。

支持信息

Apple文档:https://developer.apple.com/reference/uikit/uiview/1622498-convertrect?language=objc

帮助我了解如何使用该方法的链接:http://www.infragistics.com/community/blogs/torrey-betts/archive/2013/05/06/quick-tip-convert-coordinate-system-of-a-uiview.aspx

目标C用法:

- (CGRect)convertRect:(CGRect)rect 
         fromView:(UIView *)view;