Настройка размера автомакета UIButton

У меня есть элемент управления UIButton, размещенный в представлении, на кнопке установлено большое фоновое изображение, скажем, размер изображения составляет 600 x 300, а размер кнопки - 100 x 40, теперь я хочу добавить ограничения на ограничение ширины кнопки >= 100 и ‹= 200 зависит от ширины заголовка.

Проблема в том, что ширина кнопки всегда растягивается до 200 вместо фактической ширины заголовка, потому что фоновое изображение слишком велико, чем 200 пикселей. Но я хочу, чтобы ширина соответствовала заголовку, отличному от фонового изображения.

Я попытался уменьшить приоритет изображения кнопки по горизонтали, используя setContentHuggingPriority и setContentCompressionResistancePriority, но, к сожалению, это не работает. Пожалуйста помоги!!!


person Terence    schedule 22.02.2016    source источник


Ответы (1)


Вы должны создать IBOutlet для ограничения ширины вашей кнопки, тогда вы можете сказать что-то вроде:

self.buttonWidthConstraint.constant = button.titleLabel?.sizeThatFits(button.frame.size).width

Или, если вам это нужно в target-c:

self.buttonWidthConstraint.constant = [self.button.titleLabel sizeThatFits:self.button.frame.size].width;
person beyowulf    schedule 22.02.2016
comment
что такое .buttonWidthConstraint.constant? Я не нахожу такого имущества. Или вы имеете в виду добавление ограничения ширины к кнопке? Я сделал это, я добавил ограничение ширины ›= 100 и ‹=200 к кнопке, как я уже описал. - person Terence; 23.02.2016
comment
Вы должны создать IBOutlet для ограничения ширины, которое вы добавили. В качестве примера я назвал его buttonWidthConstraint. Вы можете создать IBOutlet, перетащив элемент управления из иерархии представлений в свой класс. - person beyowulf; 23.02.2016
comment
Я так и понял. Что ж, хотя я не хочу, чтобы раскадровка была частью кода, пока это лучшее решение. Спасибо. Кстати, sizeThatFits(button.frame.size) не подойдет. Это должно быть title.boundingRectWithSize(...).width + button.titleLabel.frame.origin.x + вставка заголовка слева и справа. Пожалуйста, измените его, и я отмечу его как ответ. - person Terence; 24.02.2016
comment
Что вы имеете в виду под не будет делать работу? - person beyowulf; 24.02.2016
comment
Это не изменяет ширину должным образом, потому что на button.frame.size влияет фоновое изображение, а не заголовок, поэтому в моем случае button.frame.size.width = 200, а sizeThatFits просто устанавливает ширину метки заголовка в ширину кнопки. Это не то, чего я хочу. - person Terence; 24.02.2016
comment
Вы вызываете sizeThatFits для кнопки или для заголовка кнопки, как я делаю в предоставленном коде? Он отлично работает для меня в примере проекта, который я создал. Ширина кнопки будет точно соответствовать ширине titleLabel. Вы можете добавить буфер к ограничению, если вам нужно какое-то дополнение. Более того, я почти на 100% уверен, что sizeThatFit просто вызывает boundingRectWithSize, так что это не лучшее решение. Кстати, вы должны удалить ограничения ширины, которые составляют ›= 100 и ‹= 200, если вы еще этого не сделали, возможно, поэтому вы получаете странные результаты. - person beyowulf; 24.02.2016
comment
Это не проблема ограничений. button.titleLabel?.sizeThatFits(button.frame.size) всегда возвращает меньший размер. Кажется, что sizeThatFits не считает измененный шрифт. шрифт метки имеет размер системного шрифта 20, ширина, рассчитанная с помощью boundingRectWithSize, равна 135, а sizeThatFits всегда возвращает 63. (Я проверил, что шрифт был изменен) - person Terence; 24.02.2016
comment
Я могу изменить шрифт, и он по-прежнему идеально подходит. Я могу изменить его в IB или в коде с тем же результатом. Как я уже сказал, sizeThatFits вызывает boundingRectWithSize, но передает атрибуты из titleLabel, следовательно, это более элегантное решение. - person beyowulf; 24.02.2016
comment
Я разбираюсь в проблеме. вы правы, sizeThatFits работает нормально, ЕСЛИ название не изменено. Когда заголовок кнопки изменяется с помощью setTitle(title, forState: .Normal), текст button.titlelable.text не изменяется немедленно. что означает, что sizeThatFits вычисляет только ширину button.titlelable.text, а не заголовок состояния кнопки. И это вызывает неправильную ширину. - person Terence; 24.02.2016