我有一个Tableview,上面是一个分段控制器。基于先前的用户动作,该分段控制器被隐藏或显示。
如果它被隐藏了,我想调整我的tableview,以使它看起来不错(否则我的屏幕上有一个空白的间隙)。
我尝试了以下代码(放在ViewDidLoad中),但它没有用。放置在ViewDidAppear或其他功能中时,它也无法正常工作。 Tableview是从Storyboard引用的,它不是以编程方式创建的。
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
}
我尝试了一些其他的东西,比如使用偏移框架然后调整高度,但这也不起作用......
答案 0 :(得分:1)
如果您正在使用Autolayout,并且想要更改框架,请尝试约束(IBOutlet
的{{1}})。
设置约束出口并通过以下方式更改NSLayoutConstraint
值:
constant
使用自动调整表单实用程序
您也可以通过代码(obj-c)来完成:
self.sampleConstraint.constant = 20
self.view.layoutIfNeeded()
答案 1 :(得分:0)
我的第一个猜测是你使用的是AutoLayout。在这种情况下,对视图框架的更改通常不会产生任何影响。您是否经过双重检查以确保故事板已关闭?
如果做不到这一点,最有可能导致改变无效的原因就是打破出口。添加println以显示self.tableView(或设置断点并从调试器中检查它)并确保它不是nil。
顺便说一句,对你的尺码使用常数值("魔术数字")是一个坏主意。该代码仅适用于单个屏幕尺寸,如果对布局进行任何更改,则会中断。您应该编写代码以使其灵活。根据视图控制器内容视图的大小或先前的帧大小计算帧。
答案 2 :(得分:0)
我找到了解决方法。如果要使用自动布局但仍能够在运行时调整某些视图的大小,则可以调用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的原始答案。