Как центрировать подвид UIView



у меня есть UIView внутри UIViewm и я хочу внутренний UIView чтобы всегда центрироваться внутри внешнего, без необходимости изменять ширину и высоту.



Я установил распорки и пружины так, чтобы он был сверху/слева/справа/снизу, не устанавливая размер. Но это все еще не центр. Есть идеи?

702   12  

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()
    }

}

это позволит создать этот взгляд: начало и центр черного прямоугольника соответствуют тем же координатам, что и его родитель

enter image description here

теперь давайте попробуем добавить подпанели другой 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)

и вот результат:

enter image description here

из-за этой строки:

subSubView.frame.origin = subView.frame.origin;

вы ожидаете, что происхождение фиолетового прямоугольника будет таким же, как и его родитель (черный прямоугольник), но он идет под ним, и почему это так? Потому что при добавлении представления в другое представление, фрейм подвида " мир " теперь является родительским прямоугольником, если у вас есть представление о том, что его начало на главном экране находится в координатах (15,15) для всех его подвидов, верхний левый угол будет (0,0)

вот почему вам нужно всегда ссылаться на родителя по его связанному прямоугольнику, который является "миром" его подвидов, давайте исправим эту строку:

subSubView.frame.origin = subView.bounds.origin;

и смотрите волшебство, subSubview теперь находится точно в его родителе происхождение:

enter image description here

Итак, вам нравится " хорошо, я только хотел центрировать свое мнение по мнению моих родителей, в чем дело?" ну, это не имеет большого значения, вам просто нужно "перевести" родительскую центральную точку, которая берется из ее фрейма в центр родительских границ делая это:

subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);

вы на самом деле говорите ему: "возьмите центр просмотра родителей и преобразуйте его в мир subSubView".

и вы получите это результат:

enter image description here

Я хотел бы использовать:

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];
  1. если вы UIView + Autolayout или Purelayout:

    [view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
    [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
    
  2. если вы используете только режим программирования с использованием 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);
})];

самый простой способ:

child.center = parent.center

enter image description here

набор этого функциями автоматического изменения Маска в ваш внутренний вид.

С 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];

вот как это выглядит:

Center with PureLayout

можно использовать

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

    Ничего не найдено.