我知道这有点讨厌,技术上不推荐,但我在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有一个内置的简单解决方案。
答案 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;