Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Objective-C

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)

Ответ 2

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

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

И для Свифта:

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

Ответ 3

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

}

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

введите описание изображения здесь

Теперь попробуйте добавить subView еще один SubSubView и дадим subSubview такое же происхождение, что и 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)

И это результат:

введите описание изображения здесь

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

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

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

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

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

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

введите описание изображения здесь

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

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

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

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

введите описание изображения здесь

Ответ 4

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

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);

Ответ 5

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

Ответ 6

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

child.center = parent.center

Ответ 7

enter image description here

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

Ответ 8

С помощью IOS9 вы можете использовать API привязки макета.

Код будет выглядеть так:

childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true

Преимущество этого над CGPointMake или CGRect заключается в том, что с помощью этих методов вы устанавливаете центр представления на константу, но с помощью этой методики вы устанавливаете связь между двумя представлениями, которые будут удерживаться навсегда, no как изменяется parentview.

Просто убедитесь, что прежде чем делать это:

        self.view.addSubview(parentView)
        self.view.addSubView(chidview)

и установить для translatesAutoresizingMaskIntoConstraints для каждого представления значение false.

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

Ответ 9

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

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

И в Swift 3.0

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

Ответ 10

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

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

Ответ 11

Другое решение с PureLayout с помощью autoCenterInSuperview.

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

[outerview addSubview:innerView];

[innerView autoCenterInSuperview];

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

Center with PureLayout

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

func callAlertView() {

    UIView.animate(withDuration: 0, animations: {
        let H = self.view.frame.height * 0.4
        let W = self.view.frame.width * 0.9
        let X = self.view.bounds.midX - (W/2)
        let Y = self.view.bounds.midY - (H/2)
        self.alertView.frame = CGRect(x:X, y: Y, width: W, height: H)
        self.alertView.layer.borderWidth = 1
        self.alertView.layer.borderColor = UIColor.red.cgColor
        self.alertView.layer.cornerRadius = 16
        self.alertView.layer.masksToBounds = true
        self.view.addSubview(self.alertView)

    })


}// calculation works adjust H and W according to your requirement