У меня есть UIView
внутренний UIView
метр, и я хочу, чтобы внутренний UIView
всегда был по центру внутри внешнего, без необходимости изменять ширину и высоту.
Я установил распорки и пружины так, чтобы они находились сверху / слева / справа / снизу, без изменения размера. Но все равно не в центре. Любая идея?
iphone
objective-c
ios
ipad
xonegirlz
источник
источник
Ответы:
Objective-C
стриж
источник
bounds
а неframe
, посколькуframe
не определено, если в представлении естьtransform
.size
используется.frame
свойство не определено, если представление имеетtransform
не преобразование идентичности; прочтите документацию по свойству фрейма UIView .Вы можете это сделать, и это всегда будет работать:
И для Swift:
источник
child.center = parent.center
. Я бы использовал `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '. Это всегда будет иметь ваше подчиненное представление по центру, независимо от того, на что настроен ваш родительский центр просмотра.UIView.bounds
относительно самого представления (и поэтомуbounds.origin
изначально равен нулю), аUIView.center
задается в системе координат супервизора .Прежде чем мы начнем, напомним, что исходной точкой является верхний левый угол.
CGPoint
вида. Важно понимать взгляды и родителей.Давайте посмотрим на этот простой код, контроллер представления, который добавляет к нему черный квадрат:
Это создаст это представление: начало и центр черного прямоугольника соответствуют тем же координатам, что и его родительский элемент.
Теперь давайте попробуем добавить subView другой SubSubView и дать subSubview то же происхождение, что и subView, но сделать subSubView дочерним представлением subView
Мы добавим этот код:
И вот результат:
Из-за этой строки:
Вы ожидаете, что начало координат пурпурного прямоугольника будет таким же, как у его родительского (черный прямоугольник), но оно проходит под ним, и почему это так? Поскольку, когда вы добавляете представление к другому представлению, фрейм subView "world" теперь становится его родительским BOUND RECTANGLE, если у вас есть представление, что его начало на главном экране находится в координатах (15,15) для всех его подвидов, верхний левый угол будет (0,0)
Вот почему вам нужно всегда ссылаться на родительский элемент через связанный прямоугольник, который является «миром» его подвидов, давайте исправим эту строку:
И посмотрите на волшебство, subSubview теперь находится точно в своем родительском источнике:
Итак, вам нравится: «Хорошо, я только хотел сосредоточить свое мнение на взгляде родителей, в чем дело?» ну, в этом нет ничего страшного, вам просто нужно «перевести» родительскую центральную точку, которая берется из этого кадра, в родительский центр границ, выполнив следующие действия:
Вы фактически говорите ему: «Возьми родительский центр просмотра и преобразуй его в мир subSubView».
И вы получите такой результат:
источник
Я хотел бы использовать:
Мне нравится использовать
CGRect
опции ...SWIFT 3:
источник
1. Если у вас включена автоматическая раскладка:
Прежде всего отключите автоматическое изменение размеров дочерних представлений
Если вы используете UIView + Autolayout или Purelayout :
Если вы используете только методы автоматического размещения на уровне UIKit:
2. Без автопрокладки:
Я предпочитаю:
источник
CGRectIntegral
Самый простой способ:
источник
Установите эту маску с автоизменением размеров на свой внутренний вид.
источник
С IOS9 вы можете использовать API привязки макета.
Код будет выглядеть так:
Преимущество этого перед
CGPointMake
или вCGRect
том, что с помощью этих методов вы устанавливаете центр представления на константу, но с помощью этого метода вы устанавливаете отношения между двумя представлениями, которые будут сохраняться вечно, независимо от того, какparentview
изменения.Только обязательно перед этим сделайте:
и установить
translatesAutoresizingMaskIntoConstraints
для каждого представления значение false.Это предотвратит сбой и вмешательство AutoLayout.
источник
Ты можешь использовать
И в Swift 3.0
источник
Самый простой способ сделать это - использовать один и тот же центр в представлении и дополнительном представлении. Вы можете сделать что-то вроде этого,
источник
Другое решение с использованием PureLayout
autoCenterInSuperview
.Вот как это выглядит:
источник
В C # или Xamarin.ios мы можем использовать вот так
imageView.Center = новый CGPoint (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
источник
Я хотел бы использовать:
Это просто, коротко и мило. Если вы используете ответ @ Hejazi выше и для
parent.center
него установлено что-либо, кроме(0,0)
вашего subview, не будет центрировано!источник
источник