UITableViewCell根据屏幕方向改变列宽 IOS Swift

4

我需要在我正在开发的一个应用程序中创建下表结构。我使用UITableView创建此表格,我需要根据屏幕方向更改我的表格列宽度。我已经为列宽度设置了约束,并将在我的viewDidLoad()中使用屏幕宽度为其分配值。

然而,当屏幕方向改变时,我无法弄清如何重新对齐这些约束。我发现当方向改变时会调用viewWillTransition(),我在其中重新计算了约束并调用了setNeedsLayout()来更新表视图。然而,我无法使我的表视图在屏幕方向改变时重置表格列宽度。我是IOS平台的新手,任何帮助都将不胜感激。

HDR_parName/HDR_parValue/HDR_minValue/HDR_maxValue

Para1/value1/minvalue1/maxvalue1

Para2/value2/minvalue2/maxvalue2


你是否添加了 tableviewwidth 约束? - Subramanian P
是的,我在故事板中设置了宽度约束,如Parameter Table View.leading = leadingMargin + 10和trailingMargin = Parameter Table View.trailing + 10。 - Arun Sreekumar
你说要根据方向(如纵向或横向)改变宽度?但是在你下面的评论中,似乎你想根据单元格的索引位置来改变宽度?你到底需要什么? - Fangming
我需要根据屏幕宽度设置表格结构的列宽。我在下面的注释中提到了10%和20%的计算作为示例,但似乎让每个人都感到困惑。实际的计算如下所示:我的表视图单元格中有5个标签。标签1的宽度应为屏幕宽度的40%。其他4个标签的宽度应为屏幕宽度的15%。 - Arun Sreekumar
3个回答

5
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    let animationHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called several times during rotation, 
        // so if you want your tableView change more smooth reload it here too. 
        self?.tableView.reloadData()
    }

    let completionHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called when rotation will be completed
        self?.tableView.reloadData()
    }

    coordinator.animateAlongsideTransition(animationHandler, completion: completionHandler)

}

接下来,tableView 的数据源和代理方法将被调用,在其中您可以根据 tableView 的框架大小设置元素的大小。


嗨,它有效,但当我在竖屏模式下点击搜索栏并旋转设备到横屏模式时,在取消按钮上我的搜索栏从表视图头视图中消失了。 我在iOS 11以下的设备上遇到了这个问题。 - Pawan Ahire
@PawanAhire,没有代码很难说出问题的原因。我认为你应该创建一个单独的问题。 我的建议是,在tableView dequeueReusableCell方法中出了一些问题。 - Alex Sh.
感谢@AlexSh的快速回复。实际上,我已经在viewForHeaderInSection方法中的UIView中添加了Search控制器和Segment控制器,例如 let headerView = UIView() headerView.addSubview(self.searchController.searchBar) return headerView对于单元格: let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell 注意:我在Portrait中点击搜索栏,然后旋转设备到Landscape,然后点击取消按钮,这样我的搜索栏就消失了。 - Pawan Ahire
你需要在某个地方调用super! - Rivera

3

Swift 4

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let animationHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called several times during rotation,
        // so if you want your tableView change more smooth reload it here too.
        self?.yourTable.reloadData()
    }

    let completionHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called when rotation will be completed
        self?.yourTable.reloadData()
    }

    coordinator.animate(alongsideTransition: animationHandler, completion: completionHandler)

}

0

这是一个非常简单的解决方案,你现在做的是错误的。 考虑到你想要行宽度作为全宽度。

你不需要设置单元格宽度的任何限制,而是将尾随限制设置为你的表视图。它会处理一切。

如果你仍然面临类似的问题,那么请尝试

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    self.view.layoutIfNeeded()
}

如果你仍然遇到问题,请告诉我。


谢谢您的回复,Dev。我需要根据屏幕宽度更改表视图单元格内列的宽度。例如,第一列的宽度应该约为屏幕宽度的10%,第二列的宽度应该是屏幕宽度的20%等等。因此,如果在方向更改后屏幕宽度发生变化,我该如何重新布局我的表视图? - Arun Sreekumar
将上述解决方案应用于旋转后更新您的视图。 - Devang Tandel
谢谢@Dev_Tandel,我会尝试这个解决方案并告诉你结果。 - Arun Sreekumar
开发者,它不是这样工作的,一切都在第一次正确地显示。但是当我改变屏幕方向时,它没有根据新的屏幕宽度更改列宽度。 - Arun Sreekumar
它成功了,开发者。我在我的约束条件上遇到了一些问题,当我纠正了这些问题后,一切都正常了。 - Arun Sreekumar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接