【问题标题】:How to get the position of a table view's subview before it's displayed?如何在显示之前获取表格视图的子视图的位置?
【发布时间】:2016-07-02 14:44:50
【问题描述】:

我试过在 SO 上搜索这个,但没有找到适合我情况的东西。

这是我的层次结构和我正在尝试做的事情:

//     ->  view
//     -> ->  myLabel           //I'd like to have this match center.x with...
//     -> ->  tableView
//     -> -> ->  tableViewCell
//     -> -> -> ->  UIStackView
//     -> -> -> -> ->  mySwitch    //...this, before everything appears

关于如何实现这一点的任何建议?非常感谢所有帮助。谢谢!


编辑:此代码适用于定位,但在出现之前不会运行。它在必须加载/重用单元格时运行,因此它首先出现在错误的位置:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCellWithIdentifier("myCell") as? myCell {
        cell.configureCell(myArray[indexPath.row])
        let centerPoint = cell.mySwitch.convertPoint(cell.mySwitch.center, toView: self.view)
        myLabel.center.x = centerPoint.x - (myLabel.frame.width / 2)
        return cell
    } else {
       return myCell()
    }
}

【问题讨论】:

  • 是的,它是在 myCell.swift 中编程的(我正在使用的 tableViewCell 子类的控制器)
  • 你知道Switch在单元格内的位置吗?
  • 是的,对不起,我忘了提:我能够获得开关的全局位置,但我不知道在哪里实现更改标签位置的代码,所以它发生在事情出现之前.我会用我发现可以工作的代码更新我的问题,加上我在层次结构中遗漏的堆栈视图,以防万一
  • @SeanC.Li 如果您事先知道 Switch 的位置,您可以使用自动布局来设置标签的位置,以便在视图实际出现之前,所有内容都会正确显示在适当的位置。您不应该将 Label 紧贴到 Switch,因为单元格由 TableView 处理并被回收,并在与屏幕中其他视图不同的时间出现和消失。
  • 我想要做的是让我的表格根据屏幕大小动态改变宽度。那部分有效。表格中的每个单元格都有一个开关(使用自动布局定位相同),我只想在顶部给开关一个标题,以便用户知道他们在做什么。我不介意每次出现单元格时都运行代码,如果需要的话。

标签: ios swift uitableview uiview


【解决方案1】:

我不确定我是否理解你的问题,但你可以尝试使用

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

您可以获取引用单元格并使用 cell.yourSwitch.frame.origin 作为位置

【讨论】:

  • 我尝试了该功能并将我的代码从上面放入其中(从'let centerPoint'行开始),但它不会构建,说“'UITableViewCell'类型的值没有成员'我的开关'”。还有其他方法吗?
  • 您必须创建一个扩展 UITableViewCell 的自定义类,将此类分配给您的单元格,然后在您的单元格定义中创建一个开关的 IBOutlet。然后您可以使用 cell.yourSwitch 访问它,从而获取位置值。
【解决方案2】:

更新:感谢大家的帮助。对于任何有兴趣的人,我放弃并求助于在界面生成器中使用尺寸类,尽管以编程方式执行它会更理想(使 IMO 更清洁,而不是必须针对每个尺寸类进行定制。现在两个项目实际上并没有相互限制,我手动定位它们)。将此问题留给任何想评论或阅读的其他读者!

【讨论】:

    【解决方案3】:

    根据您的 cmets,您应该这样做(尽管我不建议这样做,因为它会影响您的应用程序的性能)

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
    {
        //Option 1
        (cell as! MyCell).mySwitch...
    
        //Option 2
        let cell: MyCell = cell as! MyCell
        cell.mySwitch...
    }
    

    但是,如果我理解正确并且所有开关都位于每个单元格中的同一级别,那么您需要做的就是以与放置其他所有内容相同的方式放置标签,以便它看起来与开关对齐,而无需实际上是把它们绑在一起。

    【讨论】:

    • 非常感谢您的意见。我想说我尝试了一些非常相似的东西,但也许可以解决它的是你将单元格投射为的方式!我的细胞。否则,它似乎与其他人的建议和我尝试的相似,但它不会构建,说cell 不包含mySwitch。无论哪种方式,我只是求助于 IB 并手动确保它们看起来像您还建议的每个尺寸类别中的 center.x 匹配。对我来说不是那么理想或有趣,因为它不能保证标签的未来性,但它确实起到了作用。谢谢!!
    • P.S.该应用程序与 iphone 和 ipad 兼容,这就是为什么我想以编程方式执行它,如果你发现我的漂移哈哈。
    • @SeanC.Li 如果您使用自动布局,则在 iPad 或任何 iPhone 中显示屏幕不会有任何问题,因为它都根据约束正确定位(这就是为什么更好使用约束而不是框架,因为它消除了视图定位背后的所有数学)。如果需要,您甚至可以通过使用 UIDevice.current().userInterfaceIdiom == (.pad OR .phone) 根据设备更改约束,希望它有所帮助,如果没有并且仍在寻求解决它,我很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多