Другое поведение iOS8: Autolayout с view.transform = CGAffineTransformMakeScale(0.5, 0.5), представление расположено неправильно

Я использую автоматическую раскладку,

Я хочу сделать UISwitch меньшего размера, а затем использовать view.transform = CGAffineTransformMakeScale(0.5, 0.5) для его реализации.

Над этим переключателем есть еще один вид. Этот переключатель должен быть выровнен с передним краем этого вида, и между видом и переключателем есть фиксированное вертикальное пространство, как показано на следующем рисунке:

введите здесь описание изображенияПредставления на iOS7

Однако на iOS8 внешний вид отличается:

введите здесь описание изображенияПредставления на iOS8

Похоже, что ограничения не применяются к этому переключателю.

Но я позвонил self.view.layoutSubviews() и self.view.layoutIfNeeded()

Это не работает.

Как сделать, чтобы этот переключатель всегда был прикреплен к правому нижнему углу изображения выше?

Вот переключатель не уменьшен

введите здесь описание изображения


person Honghao Zhang    schedule 18.09.2014    source источник
comment
Auto Layout не работает с преобразованиями слоев   -  person Max MacLeod    schedule 18.09.2014
comment
@MaxMacLeod Мне просто интересно, почему один и тот же код ведет себя по-разному на iOS7 и iOS8. Я думаю, вы имеете в виду этот ответ -being-used/14105757#14105757">ссылка, верно?   -  person Honghao Zhang    schedule 18.09.2014
comment
Я предполагаю, что это ведет себя так, потому что внутренний размер содержимого UISwitch остается по умолчанию w: 51px h: 31px, несмотря на изменение преобразования представления. Вы должны попытаться создать подкласс UISwitch и переопределить метод - (CGSize)intrinsicContentSize, возвращая CGSizeMake(25.5f, 15.5f)   -  person Emmanuel Paris    schedule 23.09.2014


Ответы (2)


У вас есть два возможных пути: либо создать подкласс UISwitch и попытаться применить все необходимые модификации в подклассе, либо определить новый UIView, который включает в качестве подпредставления модифицированный UISwitch. Подкласс может быть самым быстрым, но он сложнее и опаснее, поскольку UISwitch не предназначался в качестве подкласса для такого рода модификаций.

Предположим, вы идете по пути создания подклассов, вот изменения, которые вам необходимо сделать:

  1. применить преобразование масштабирования к self, очевидно.

  2. переопределить alignmentRectForFrame:, поэтому он возвращает super.alignmentRectForFrame: плюс преобразование масштабирования.

  3. переопределить intrinsicContentSize, поэтому он возвращает super.intrinsicContentSize плюс ваше преобразование масштабирования

По сути, номер 1 должен выполнять фактическое визуальное преобразование. Но 2 и 3 необходимы для информирования Auto Layout о размере нового представления, так как по умолчанию AL не знает о преобразованиях.

person algal    schedule 09.10.2014

Преобразование представления происходит вокруг центра представления, поэтому, когда вы вызываете

view.transform = CGAffineTransformMakeScale(0.5, 0.5)

Вполне логично, что это выглядит так в iOS 8, причина, по которой это выглядит хорошо в iOS 7, вероятно, из-за ошибки в iOS 7.

Попробуйте изменить константу ведущего ограничения следующим образом:

self.switchLeadingConstraint.constant = -(self.mySwitch.bounds.size.width/4)

Таким образом, вы можете компенсировать офсайд, который у вас есть в iOS 8.

person oren    schedule 22.11.2014