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

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

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

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

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

код:

DetailViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()

 //this isn't increasing the view 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)

Левая часть оператора мутации не является изменяемой: свойство 'height' доступно только для получения

//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, width: CGFloat, height:())'

Ответ 1

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

Чтобы создать выход из ограничения, перетащите его из ограничения в редакторе раскадровки (так же, как и для выхода UIView) в свой код.

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

Ответ 2

Внутри инициализатора 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 внутри инициализатора.

Ответ 3

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

Ответ 4

Используйте self.view.frame.size.height = 80