Автоматическая компоновка действует на фрейме вашего UIView. Рамка вычисляется из центра вашего вида, границ и свойств преобразования. По умолчанию view.transform — это просто CGAffineTransformIdentity, и в этой конфигурации фрейм представляет собой прямоугольник, ориентированный идентично суперпредставлению, с той же шириной и высотой, что и границы представления.
Однако, когда вы изменяете view.transform (или, что то же самое, view.layer.transform), как вы это делаете, это нарушает предсказуемую связь между центром, границами и рамкой. Например, если ваше преобразование представляет собой поворот на 20 градусов, то рамка больше не будет иметь ту же ширину и высоту, что и границы. Кадр теперь будет (я думаю...) любым прямоугольником, ориентированным идентично супервиду, который необходим, чтобы содержать ваш исходный прямоугольник, который теперь повернут на 20 градусов.
А поскольку автоматическая компоновка воздействует на свойство фрейма, теперь, скорее всего, она создаст макет, который вам не нужен.
Например, предположим, что ваше представление представляет собой круг внутри прямоугольника кадра 10x10, который выровнен по верхнему левому краю с суперпредставлением через ограничения пространства. Затем вы поворачиваете его на 45 градусов. Повернутый круг выглядит так же. Но теперь кадр — это наименьший прямоугольник, который может содержать исходный прямоугольник после поворота, и этот наименьший прямоугольник равен 10/sqrt(2) x 10/sqrt(2). Когда автоматический макет применяет выравнивание по верхнему левому углу к этому новому фрейму, вы увидите, что ваш круг смещается вниз и вправо. Вместо того, чтобы визуально центрироваться в {5,5}, теперь он будет центрироваться в {5/sqrt(2),5/sqrt(2)}.
Я думаю, что средство от этого состоит в том, чтобы вручную настроить параметр «константа» ограничения макета, чтобы скорректировать эффекты вашего преобразования, или аналогичным образом переопределить выравниваниеRectForFrame, чтобы заставить автоматический макет работать с выравниваниемRect, который настроен для компенсации вашего преобразования , или же определить ваше исходное ограничение для привязки к центру вашего представления, на которое может не повлиять преобразование.
person
algal
schedule
24.11.2012