it-swarm.com.ru

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

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

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

110
xonegirlz

Objective-C

yourSubView.center = CGPointMake(yourView.frame.size.width  / 2, 
                                 yourView.frame.size.height / 2);

Swift

yourSubView.center = CGPoint(x: yourView.frame.size.width  / 2,
                             y: yourView.frame.size.height / 2)
181
happy pig

Вы можете сделать это, и это всегда будет работать:

child.center = [parent convertPoint:parent.center fromView:parent.superview];

И для Свифта:

child.center = parent.convert(parent.center, from:parent.superview)
268
Hejazi

Прежде чем мы начнем, давайте просто напомним, что точка начала координат - это верхний левый угол 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()
    }

}

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

enter image description here

Теперь давайте попробуем добавить subView другой SubSubView и дать subSubview тот же Origin, что и subView, но сделаем subSubView дочерним представлением subView.

Мы добавим этот код:

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;

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

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

subSubView.frame.Origin = subView.bounds.Origin;

И посмотрите на магию, subSubview теперь находится точно в его родительском Origin:

enter image description here

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

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

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

И вы получите такой результат:

enter image description here

33
Daniel Krom

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

self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
                                    CGRectGetMidY(self.parentView.bounds));

Мне нравится использовать параметры CGRect ...

Свифт 3:

self.childView.center = CGPoint(x: self.parentView.bounds.midX,
                                        y: self.parentView.bounds.midY);
26
theprojectabot

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);
})];
20
Cemal Eker

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

child.center = parent.center
12
juancazalla

enter image description here

Установите эту маску авторазмера для вашего внутреннего вида.

8
Mayank Jain

С 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.

Это предотвратит сбои и помехи AutoLayout.

7
Roymunson

Ты можешь использовать

yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))

И в Swift 3.0

yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
7
Sayali Shinde

Использование одного и того же центра в представлении и подпредставлении является самым простым способом сделать это. Вы можете сделать что-то вроде этого,

UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];
5
codeFood

Другое решение с PureLayout с использованием autoCenterInSuperview.

// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];

[outerview addSubview:innerView];

[innerView autoCenterInSuperview];

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

Center with PureLayout

4
H6.

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

child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)

Это просто, коротко и мило. Если вы используете ответ @ Hejazi выше и для parent.center установлено любое значение, кроме (0,0), ваше подпредставление не будет центрировано!

1
Old Name

В C # или Xamarin.ios мы можем использовать как это

imageView.Center = new CGPoint (tempView.Frame.Size.Width/2, tempView.Frame.Size.Height/2);

0
Anisetti Nagendra