【问题标题】:Get the position of an element获取元素的位置
【发布时间】:2012-03-06 10:18:00
【问题描述】:

当用户开始编辑显示在其中一个单元格中的 UITextField 时,我在尝试向上滚动 tableView 时遇到问题。

我的问题是我找不到知道 UITextField 在视图中位置的方法。如果我尝试做 activeTextField.frame.origin.y,我会在单元格内获得 TextField 的位置,而不是在 tableView 内。

我构建视图的方式如下: 我有一个 TableViewController,它使用初始化 UITextField 的自定义类创建单元格。然后我的 TableViewController 将 UITextField 委托设置为自身,因此我可以触发 textFieldDidBeginEditing 事件。但是如果我尝试 NSLog TextField 的 y 原点,我总是会为每个 UITextField 获得相同的值,即它在单元格中的位置。

知道如何解决这个问题吗?

【问题讨论】:

  • 您是否想弄清楚哪个单元格被点击了,我不确定我是否理解您的问题。
  • 我试图找出 UITextField 在 TableView 中的绝对位置,所以我可以滚动我的 tableView 以确保当键盘出现时该字段仍然可见。

标签: iphone objective-c ios


【解决方案1】:

这些坐标系的变化总是让人困惑......

这应该可以让您在表格视图坐标系中找到点:

CGPoint textFieldCenter = textField.center;
CGPoint pointInTableView = [tableView convertPoint:textFieldCenter fromView:textField.superview];

如果你想把它放在不同的视图中,你应该用你想要坐标的视图替换 tableView。

如果你想获取文本字段所在的表格中的单元格:

NSIndexPath* path = [tableView indexPathForRowAtPoint:pointInTableView];
UITableViewCell* cell = [tableView cellForRowAtIndexPath:path];

【讨论】:

  • 这正是我想要的!非常感谢!
  • 我在滚动视图中获取视图坐标时遇到了一些问题,但这解决了我的问题
  • 我遇到了一个需要修复的复杂问题,这成功了。想象一下在一个非常大的静态表格单元格内的 popoverView 内的一个pickerview,在一个非全屏的容器视图内! (这个想法背后的设计师已经被解雇了!)
【解决方案2】:

要获取文本字段的位置,应使用 UIView 方法convertRect:toView:

convertRect:toView: 从接收方的矩形转换一个矩形 坐标系到另一个视图的坐标系。

  • (CGRect)convertRect:(CGRect)rect toView:(UIView *)view

示例:

CGRect textFieldFrame = [self.tableview convertRect:yourTextField.frame toView:self.view];

【讨论】:

  • 如果我尝试这样做,我会得到相同的结果。 - (void)textFieldDidBeginEditing:(UITextField *)textField { CGRect textFieldFrame = [self.tableView convertRect:textField.frame toView:self.view]; NSLog(@"位置:%f", textFieldFrame.origin.y); }
  • 这取决于您的视图层次结构,但这绝对是要走的路。看看文档中的这些方法,你也可以试试 convertRect:fromView: ,比如 CGRect textFieldFrame = [self.view convertRect:yourTextField.frame fromView:self.tableview];
【解决方案3】:

【讨论】:

    【解决方案4】:

    是的,试试这个方法:

    - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated
    

    当您提示键盘时,将 tableView 滚动到选定的单元格,它应该会将单元格带到屏幕顶部。

    【讨论】:

    • 使用 UITableViewDelegate。您有一种方法可以为您提供已选择行的 indexPath。 (- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath)
    • 是的,但是如果用户单击单元格中的文本字段而不是单元格本身,则不会调用该方法。刚刚试了一下,只有点击单元格中的其他地方才会触发该方法。
    • 哼,有趣。您的 TextField 位于 UITableViewCell 的 contentView 属性上吗?您还有其他获取 Cell 位置的方法吗?
    • 我的 UITableViewCell 有一个自定义类,在这里我以这种方式创建我的 UITextField:textField = [[UITextField alloc] initWithFrame:CGRectMake(160.0, 9.0, 120.0, 23.0)];跨度>
    【解决方案5】:

    试试这个

    CGPoint locationinView=[cellView convertPoint:location fromView:tableView];
    

    这里的位置是cellView中textField的点。

    【讨论】:

    • 不确定我是否理解你的意思。我确实知道我的文本字段在 cellView 中的位置。我想知道的是textfield在tableView中的位置,或者是TextField所在单元格的索引
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2013-04-20
    • 2015-07-17
    • 2015-07-29
    相关资源
    最近更新 更多