UITableViewController 布局不起作用

Posted

技术标签:

【中文标题】UITableViewController 布局不起作用【英文标题】:UITableViewController layout not working 【发布时间】:2017-07-09 17:16:57 【问题描述】:

我正在尝试将 UITableView 定位到应用程序的左侧,整个高度,但只占用可用宽度的 1 / 3,代码如下:

class ViewController: UIViewController 
    var tableController: UITableViewController?

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableController = UITableViewController();

        addChildViewController(tableController!)
        self.view.addSubview(tableController!.view)
        tableController!.didMove(toParentViewController: self)
    

    override func viewDidLayoutSubviews() 
        tableController!.view.backgroundColor = UIColor.red

        tableController!.view.frame = CGRect(
            x: 0,
            y: 0,
            width: view.bounds.width / 3,
            height: view.bounds.height);

        //tableController!.view.frame = view.bounds
    

它看起来像这样:

而且我不明白为什么这些线没有正确水平对齐,而且看起来像是在右边被剪掉了。

如果我通过取消注释最后一行来为视图控制器提供全宽/全高,它看起来会更好:

【问题讨论】:

【参考方案1】:

问题 1

您是否在父视图中正确约束了 TableView?您可以设置比例约束。请看这篇关于该主题的帖子:AutoLayout to keep view sizes proportional

旁注

对于 ios 11,将视图约束到布局指南会在您的 IDE 中触发警告。考虑使用 Auto-resizing Masks 将 UI 组件嵌入到占据父视图整个宽度的另一个视图中。在此处查看主题:Xcode Auto Layout Resizing Issue

【讨论】:

避免AutoLayout而只依赖viewDidLayoutSubviews和“手动”定位有什么问题吗? AutoLayouts、Constraints 和 Auto-Resizing Masks 是 iOS 解决视图布局的基本方式......并使其看起来适合所有屏幕尺寸。如果不使用这些工具,您将 (1) 不遵循最佳实践,(2) 失去 iOS 提供的基本优势,以及 (3) 从长远来看,您的生活会变得更加困难。请参阅此处的自动布局指南:developer.apple.com/library/content/documentation/… 再一次,即使 AutoWhatever 是布局的圣杯,我仍然想知道这么简单的代码有什么问题。 右侧被切断的分隔线正是 iOS 处理这些线的方式。您可以通过创建自定义 UITableViewCell 并在 TableView 的检查器中将分隔符设置为 none 来实现自己的分隔符。通过实现您自己的自定义 UITableViewCell,您将解决所有问题。 但是全宽版没有剪线。你是说对于较小的屏幕尺寸,如果改变了它呈现这些线条的方式并且这种效果不是由布局问题引起的?

以上是关于UITableViewController 布局不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 UIViewController 中使用 UITableViewController 以编程方式自动布局

UITableViewController 表头添加一个带有自动布局约束的 UIButton

没有 Storyboard 的 Swift UITableViewCell 不使用自动布局

UITableViewController 不显示

UIImageView 不显示来自 UITableViewController 的设置图像

UItableviewController 不加载数据