调整 UITableView 的大小

Resize a UITableView

我有一个 Tableview,上面有一个 Segmented Controller。根据先前的用户操作,此分段控制器会隐藏或显示。

如果它被隐藏,我想调整我的 tableview 的大小,以便它看起来不错(否则我的屏幕上会有一个空隙)。

我尝试了以下代码(放置在 ViewDidLoad 中)但它不起作用。当放置在 ViewDidAppear 或其他函数中时,它也不起作用。 Tableview 是从情节提要中引用的,它不是以编程方式创建的。

    if selectedGroup == 1
    {
        self.tableView.frame = CGRectMake(0, 152, 320, 367)
        segControl.hidden = false
    }
    else if selectedGroup == 2
    {
        self.tableView.frame = CGRectMake(0, 116, 320, 403)
        segControl.hidden = true
    }

我尝试了一些其他的东西,比如偏移框架然后调整高度,但这也没有用...

使用自动布局

如果您正在使用自动版式并且想要更改框架,请尝试约束(IBOutlet of NSLayoutConstraint)。

设置约束出口并将constant值更改为:

self.sampleConstraint.constant = 20
self.view.layoutIfNeeded()

没有自动布局

使用自动调整表单实用程序

你也可以通过代码(obj-c)来完成:

view.autoresizingMask = (UIViewAutoresizingFlexibleWidth |    
                              UIViewAutoresizingFlexibleLeftMargin);

我的第一个猜测是您使用的是 AutoLayout。在这种情况下,对视图框架的更改通常不会产生任何影响。您是否仔细检查以确保它已为您的情节提要关闭?

否则,改变无效的最可能原因是插座坏了。添加一个 println 以显示 self.tableView(或设置断点并从调试器检查它)并确保它不是 nil。

顺便说一句,为您的尺码使用常量值 ("magic numbers") 是个坏主意。该代码仅适用于单一屏幕尺寸,如果您对布局进行任何更改,该代码将会中断。

您应该编写灵活的代码。根据view controller content view的大小,或者之前的frame size计算frame。

我找到了解决方法。如果你想使用自动布局但仍然能够在运行时调整某些视图的大小,你可以调用 viewDidLayoutSubviews。这在放置所有约束之后,但在调用 viewDidAppear 之前被调用,因此用户甚至不会注意到

override func viewDidLayoutSubviews() {
    if catswitch == "1"
    {
        self.tableView.frame = CGRectMake(0, 152, 320, 367)
        scMatur.hidden = false
    }
    else if catswitch == "2"
    {
        self.tableView.frame = CGRectMake(0, 116, 320, 403)
        scMatur.hidden = true
    }
}

请参阅 Can I disable autolayout for a specific subview at runtime? 以获取 jmstone 的原始答案。