Swift: установка высоты и ширины кнопок не имеет никакого эффекта

#ios #swift #uibutton #tvos

#iOS #быстрый #uibutton #твос

Вопрос:

У меня есть эта панель вкладок, созданная программно:
введите описание изображения здесь

 func createTabBar() {
       var arrangedSubviews = [UIView]()
       if let menus = CMSessionManager.sharedInstance.menus {
           for menu_item in menus {
               if let menuInfoDetails = menu_item as? [String: Any] {
                   let tabButton = CustomButton(color: .red, titleString: menuInfoDetails["label"] as! String)
                   // This apparently has no effect on button size
                   tabButton.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
                   arrangedSubviews.append(tabButton)
               }
           }
           stackView.alignment = .leading
           stackView = UIStackView(arrangedSubviews: arrangedSubviews)
           stackView.translatesAutoresizingMaskIntoConstraints = false
           stackView.distribution = .fillProportionally
           stackView.axis = .horizontal
           stackView.spacing = 8
           self.view.addSubview(stackView)
           stackView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 24).isActive = true
           stackView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0).isActive = true
           stackView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true
       }
   }
   
 

Я пытался программно изменить размеры кнопок:

 tabButton.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
 

Независимо от того, какую высоту, ширину или положение x y я установил, ничего не изменится.
Есть какие-нибудь идеи, что не так?

Ответ №1:

Вместо того, чтобы устанавливать фрейм напрямую, используйте автозапуск (ограничения):

 NSLayoutConstraint.activate([
    tabButton.heightAnchor.constraint(equalToConstant: 100),
    tabButton.widthAnchor.constraint(equalToConstant: 100)
])
 

Кроме того, поскольку вы используете представление стека, настройки x и y значения не будут иметь никакого эффекта, поскольку его единственное задание stack views заключается в размещении этих представлений в соответствующих местах. Поскольку вы используете spacing в своем представлении стека, нет смысла устанавливать ограничение ширины, поэтому вы должны хорошо настроить это значение и использовать только ограничение высоты.

 NSLayoutConstraint.activate([
    tabButton.heightAnchor.constraint(equalToConstant: 100)
])