Как закрепить UIView в нескольких пикселях от средней точки, используя маску авторазмера? - PullRequest
1 голос
/ 29 октября 2011

Обратите внимание на следующий снимок экрана:

iPhone Autoresizing Mask Question

Как я могу привязать UIView на несколько пикселей от средней точки, используя маску авторазмера, чтобы она всегда была на 20 пикселей слева от средней точки?

Я попытался установить для свойства autoresizingMask значение UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin, но на самом деле это не так.

Мне удалось это сделать, если я оберну вид в другой, более крупный вид, который заполняет весь экран и не изменяет размер вообще. Но есть ли способ сделать это без дополнительного просмотра?

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Маски авторазмера не очень хорошо справляются с этим случаем, как вы уже обнаружили.Они отлично работают, если вы хотите сохранить что-то на фиксированном расстоянии от суперпредставления или пропорционально изменить размер / изменить положение где-нибудь посередине.Вы можете сделать удивительную сумму с помощью только этих опций, но смещение вне центра - это не то, что вы можете сделать легко

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

Вот что вы получили прямо сейчас:

                       center
                          |
|---------------------------------------------------|  <-- The main parent view
               |-----|  <-- your view

То, что вы хотите, это:

                       center
                          |
|---------------------------------------------------|  <-- The main parent view
               |--------------------|  <-- The new view, centered in the parent
               |-----|  <-- your view

Новый вид должен бытьполностью прозрачные, имеют фиксированную ширину и гибкое расстояние с обеих сторон родительского вида.Он должен быть достаточно широким, чтобы полностью вместить смещенную от центра коробку, и не шире.Если он расположен точно в центре основного родительского вида, он останется по центру независимо от размера родительского вида.

Затем добавьте поле в качестве подпредставления нового представления сфиксированная ширина и фиксированное расстояние от левого края родительского элемента.Теперь, используя только маски с автоматическим изменением размера, ваш вид останется там, где вам нужно.

Более простой вариант может заключаться в том, чтобы переопределить -layoutSubviews в вашем представлении или -viewDidLayoutSubviews на вашем контроллере (доступно iOS 5.0 и более поздние версии)и просто вручную расположить вид.Но вы спросили, как это сделать с помощью масок с автоматическим изменением размера, вот что вы получили.Без добавления дополнительного представления невозможно использовать маски с автоматическим изменением размера для получения требуемого поведения при позиционировании.

1 голос
/ 29 октября 2011

Не совсем ответ, скорее путь для исследования.Вы можете попробовать поиграть со свойством уровня слоя anchorPoint.Установка его в (1.0, 0.5) означает, что положение слоя будет определяться его правым краем.В этом случае по центру будет означать, что правый край центрируется.Установите гибкий левый край и гибкий правый край, и он может остаться слева от центра.

Чтобы получить его точно на 20p слева от центра, просто установите anchorPoint на 20p справа от центра вида.(Но единицы измерения anchorPoint являются частью размера слоя, поэтому сделайте небольшую математическую операцию, чтобы найти правильное значение.)

Я не уверен, будет ли это работать.Я не уверен, каковы эффекты смешивания позиционирования на уровне слоя с авторазмером.

1 голос
/ 29 октября 2011

Полагаю, лучшее решение - установить для свойства center значение:

myview.center = CGPointMake (self.view.frame.size.width / 2-20, myview.center.y);

И настройте его методом willRotate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...