Как программно увеличить высоту UIView с помощью Swift

внутри IB у меня есть viewController с segmentedControl и 2 containerViews. В каждом containerView у меня есть tableView. Из каждого tableView я нажимаю на detailView. Мой автоматический макет находится в IB.

как только я выбираю сегмент, я вижу соответствующий tableView, я выбираю ячейку, и правильный detailView выталкивается на сцену.

проблема заключается в том, что как только detailView выталкивается на segmentedControl, он все еще виден. Я решил скрыть segmentedControl, который работает, но там большое пустое пространство. Я попытался программно увеличить размер представления detailView, но он не расширяется. Из того, что я читал, это потому, что я сделал начальные ограничения в раскадровках.

как программно получить представление detailView для расширения?

код:

DetailViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()

 //this isn't increasing the view's size
 self.view.frame.size.height += 20.0

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)
 }

}

ошибки:

//Error for the last argument- height: *self.view.frame.height += 20.0*
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

левая сторона мутирующего оператора не изменяема: "высота" -это get-only собственность

//Error for the last argument- *self.view.frame.size.height += 20.0*:
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)

не удается вызвать инициализатор для типа 'CGRect' со списком аргументов тип '(x: Int, y: Int, ширина: CGFloat, высота: ())'

3 ответов


вам нужно создать выход для ограничения высоты подробного представления, а затем вы можете настроить высоту программно, как это myHeightConstraint.constant += extraHeight здесь extraHeight - это число, указывающее, насколько выше вы хотите, чтобы подробный вид был. Вам также может потребоваться позвонить self.view.layoutIfNeeded() потом.

чтобы создать выход из ограничения, перетащите элемент управления из ограничения в Редакторе раскадровки (как и для выхода UIView) в код.

вы правы - поскольку вы используете автоматическую компоновку и ограничения, корректировки также должны быть сделаны с ограничениями. Установка необработанных кадров может привести к неожиданному поведению. Дайте мне знать, если у вас есть какие-либо другие вопросы или трудности.


внутри CGRect инициализатор вы не должны использовать +=, просто +.

изменения:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

в:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 20.0)

вы не должны пытаться изменить значение self.view.frame.height внутри инициализатора.


есть ли какие-либо ограничения по высоте, установленные для segmentedControl, если это так, вы можете удалить их при загрузке подробного представления