Как центрировать подвид UIView
у меня есть UIView внутри UIViewm и я хочу внутренний UIView чтобы всегда центрироваться внутри внешнего, без необходимости изменять ширину и высоту.
Я установил распорки и пружины так, чтобы он был сверху/слева/справа/снизу, не устанавливая размер. Но это все еще не центр. Есть идеи?
12 ответов:
С
yourSubView.center = CGPointMake(yourView.frame.size.width / 2, yourView.frame.size.height / 2);Свифт
yourSubView.center = CGPoint(x: yourView.frame.size.width / 2, y: yourView.frame.size.height / 2)
Вы можете сделать это, и она всегда будет работать:
child.center = [parent convertPoint:parent.center fromView:parent.superview];и быстро:
child.center = parent.convert(parent.center, from:parent.superview)
прежде чем мы начнем, давайте просто напомним, что точка начала координат-это верхний левый угол
CGPointвид. Важно понимать о взглядах и родителях.давайте взглянем на этот простой код, контроллер вида, который добавляет к его виду черный квадрат:
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. createDummyView() super.view.backgroundColor = UIColor.cyanColor(); } func createDummyView(){ var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50)); super.view.addSubview(subView); view.backgroundColor = UIColor.blackColor() } }это позволит создать этот взгляд: начало и центр черного прямоугольника соответствуют тем же координатам, что и его родитель
теперь давайте попробуем добавить подпанели другой SubSubView, и давая subSubview же происхождения, как подпанели, но subSubView вид ребенка подпанель
мы добавим этот код:
var subSubView = UIView(); subSubView.frame.origin = subView.frame.origin; subSubView.frame.size = CGSizeMake(20, 20); subSubView.backgroundColor = UIColor.purpleColor() subView.addSubview(subSubView)и вот результат:
из-за этой строки:
subSubView.frame.origin = subView.frame.origin;вы ожидаете, что происхождение фиолетового прямоугольника будет таким же, как и его родитель (черный прямоугольник), но он идет под ним, и почему это так? Потому что при добавлении представления в другое представление, фрейм подвида " мир " теперь является родительским прямоугольником, если у вас есть представление о том, что его начало на главном экране находится в координатах (15,15) для всех его подвидов, верхний левый угол будет (0,0)
вот почему вам нужно всегда ссылаться на родителя по его связанному прямоугольнику, который является "миром" его подвидов, давайте исправим эту строку:
subSubView.frame.origin = subView.bounds.origin;и смотрите волшебство, subSubview теперь находится точно в его родителе происхождение:
Итак, вам нравится " хорошо, я только хотел центрировать свое мнение по мнению моих родителей, в чем дело?" ну, это не имеет большого значения, вам просто нужно "перевести" родительскую центральную точку, которая берется из ее фрейма в центр родительских границ делая это:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);вы на самом деле говорите ему: "возьмите центр просмотра родителей и преобразуйте его в мир subSubView".
и вы получите это результат:
Я хотел бы использовать:
self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds), CGRectGetMidY(self.parentView.bounds));мне нравится использовать
CGRectпараметры...SWIFT 3:
self.childView.center = CGPoint(x: self.parentView.bounds.midX, y: self.parentView.bounds.midY);
1. Если у вас включен автозапуск:
- подсказка: для центрирования представления на другом представлении с автозапуском вы можете использовать один и тот же код для любых двух представлений, имеющих хотя бы один родительский вид.
в первую очередь отключить мнения ребенка функциями автоматического изменения
UIView *view1, *view2; [childview setTranslatesAutoresizingMaskIntoConstraints:NO];
если вы UIView + Autolayout или Purelayout:
[view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2]; [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];если вы используете только режим программирования с использованием UIKit уровне методы:
[view1 addConstraints:({ @[ [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f], [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f] ]; })];2. Без автозапуска:
Я предпочитаю:
UIView *parentView, *childView; [childView setFrame:({ CGRect frame = childView.frame; frame.origin.x = (parentView.frame.size.width - frame.size.width) / 2.0; frame.origin.y = (parentView.frame.size.height - frame.size.height) / 2.0; CGRectIntegral(frame); })];
С IOS9 вы можете использовать API привязки макета.
код будет выглядеть так:
childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = trueпреимущество этого над
CGPointMakeилиCGRectэто то, что с помощью этих методов вы устанавливаете центр представления на константу, но с помощью этой техники вы устанавливаете отношения между двумя представлениями, которые будут держаться вечно, независимо от того, какparentviewизменения.просто убедитесь, прежде чем сделать это, чтобы сделать:
self.view.addSubview(parentView) self.view.addSubView(chidview)и установить
translatesAutoresizingMaskIntoConstraintsдля каждого представления false.это предотвратит сбой и автозапуск от вмешательства.
использование одного и того же центра в представлении и подвиде является самым простым способом сделать это. Вы можете сделать что-то вроде этого,
UIView *innerView = ....; innerView.view.center = self.view.center; [self.view addSubView:innerView];
другое решение с PureLayout используя
autoCenterInSuperview.// ... UIView *innerView = [UIView newAutoLayoutView]; innerView.backgroundColor = [UIColor greenColor]; [innerView autoSetDimensionsToSize:CGSizeMake(100, 30)]; [outerview addSubview:innerView]; [innerView autoCenterInSuperview];вот как это выглядит:
можно использовать
yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))И В Swift 3.0
yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
Я хотел бы использовать:
child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)Это просто, коротко и сладко. Если вы используете ответ @Hejazi выше и
parent.centerимеет значение, отличное от(0,0)ваш подвид не будет центрирован!






Comments