UIView의 서브 뷰를 중앙에 배치하는 방법


128

나는 UIView내부에 UIViewm 이 있고 내부가 UIView너비와 높이의 크기를 조정할 필요없이 항상 외부 내부의 가운데에 오기 를 원합니다 .

스트럿과 스프링을 크기 조정을 설정하지 않고 위 / 왼쪽 / 오른쪽 / 아래에 놓았습니다. 그러나 여전히 중심에 있지 않습니다. 어떤 생각?


2
허용 된 답변이 잘못되어 충돌합니다. Hejazi의 대답은 훌륭합니다.
Fattie

답변:


209

목표 -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)

51
당신은 사용해야 bounds아닌을 frame(가)로, frame뷰가있는 경우 정의되지 않습니다 transform.
omz

1
이 경우에만 size사용 되므로 실제로는 달라지지 않습니다 .
Peter DeWeese 2016 년

1
중요하지 않습니다 frame. 뷰 transform에 아이덴티티 변환이 아닌 뷰가 있으면 전체 속성이 정의되지 않습니다. UIView의 frame 속성에 대한 문서를 읽으십시오 .
omz 2016 년

6
불행히도이 답변은 실제로 틀 렸습니다 . 간단히 Heja의 정답을 사용하십시오.
팻티

@Fattie 여기서 정확히 무엇이 잘못 되었습니까? View 내에서 ImageView를 중앙에 배치하는 데 사용했으며 작동 중입니다.
jreft56

284

이 작업을 수행하면 항상 작동합니다.

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

그리고 스위프트의 경우 :

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

1
나중에 잊지 말고 child.frame = CGRectIntegral (child.frame);
Fattie

8
하나 : 부모보기의 중심 / 위치를 변경하지 않은 경우에만 작동합니다. 둘째 : 이 방법을 사용하는 경우 포인트를 변환 할 필요가 없습니다 (이미 올바른 형식 임) 을 사용하십시오 child.center = parent.center. `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '를 사용합니다. 부모 뷰 센터의 설정에 관계없이 항상 서브 뷰를 중앙에 배치합니다.
이전 이름

1
뷰가 뷰 계층 구조에 아직 추가되지 않은 경우에도 유용하지 않습니다 (예 : 객체를 초기화 할 때)
Victor

1
@Hejazi 빠른 답변을 추가하는 것도 좋을 것입니다;)
Milad Faridnia

1
@Soumen 아니오, 차이가 있습니다. UIView.bounds뷰 자체에 상대적 이므로 bounds.origin(초기 0 임) superviewUIView.center 의 좌표계에 지정됩니다 .
Hejazi

41

시작하기 전에 원점이 왼쪽 위 모서리임을 상기시켜 보겠습니다. 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;

자주색 직사각형의 원점이 부모 (검은 색 직사각형)와 같을 것으로 예상되지만 그 아래에 있습니다. 그 이유는 무엇입니까? 다른 뷰에 뷰를 추가 할 때 서브 뷰 프레임 "world"는 이제 상위 BOUND RECTANGLE입니다. 메인 화면에서 원점이 뷰인 경우 뷰의 모든 뷰에 대해 뷰 (15,15)가됩니다. 왼쪽 상단은 (0,0)입니다

그렇기 때문에 subViews의 "세계"인 바운드 사각형으로 부모를 항상 참조 해야하는 이유는 다음과 같습니다.

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

그리고 마술을보십시오, subSubview는 이제 정확히 부모 원점에 있습니다 :

여기에 이미지 설명을 입력하십시오

"좋아요. 부모님의 견해로만 내 견해를 집중하고 싶었습니다. 큰 문제는 무엇입니까?" 글쎄요, 별거 아니에요, 당신은 이것을함으로써 부모 중심점을 프레임에서 부모의 경계 센터로 "번역"하면됩니다 :

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

당신은 실제로 그에게 "부모님의 견해를 가져 가서 subSubView 세계로 변환하십시오"라고 말하고 있습니다.

그리고 당신은이 결과를 얻을 것이다 :

여기에 이미지 설명을 입력하십시오


'subSubView.center = subView.convertPoint (subView.center, fromView : subSubView)'줄이 어디에 위치합니까?
Thamarai T

26

나는 사용할 것이다 :

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

19

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

6
허용 된 답변과 달리이 솔루션은 픽셀 경계에 깔끔하게 정렬되고 특정 너비에 대한 시야의 흐려짐을 방지합니다.
Brad Larson

1
내가 실수하지 않으면 child.frame = CGRectIntegral (child.frame); BL이 설명하는 문제에 대한 모든 종류의 잡기 / 사용 솔루션의 우아한 종류입니다.
Fattie

1
@JoeBlow : 감사합니다. 나는 반올림을 좋아했지만 블록 스타일로 사용하는 것이 더 우아합니다.CGRectIntegral
Cemal Eker

프레임을 설정하는 데 사용하는 구문을 설명해 주시겠습니까? 전에는 보지 못했습니다. 속성에 할당 된 "클로저"의 항상 마지막 문장입니까? Apple 문서에서 어디서 찾을 수 있습니까?
Johannes

"UIKit 레벨 자동 레이아웃 방법 만 사용하는 경우"오류가 발생합니다.
Jonny

13

가장 쉬운 방법 :

child.center = parent.center

내 말은 이것이 어떻게 작동하는지 더 많은 설명 / 설명을 추가해야한다는 것입니다.
Tushar

이 유형의 많은 답변을 검색하면이 간단한 방법으로 나를 속일 수 있습니다. 감사.
gbossa

9

여기에 이미지 설명을 입력하십시오

이 자동 크기 조정 마스크를 내부보기로 설정하십시오.


1
자동 레이아웃을 사용하면 자동 크기 조정 창이 없습니다.
Allen

@Allen 자동 크기 조정을 사용하려면 자동 레이아웃을 비활성화해야합니다.
Mayank Jain

8

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 로 설정합니다 .

이렇게하면 충돌 및 자동 레이아웃이 방해를받지 않습니다.


8

당신이 사용할 수있는

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

그리고 스위프트 3.0

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

1
두 번째 코드 예제는 빠른 4에서 완벽하게 작동합니다. GREAT 👍🏻!
iGhost

예! 마지막으로 감사합니다. midX / midY에 대해 몰랐습니다. 퍼펙 토.
Dave Y

5

뷰와 서브 뷰에서 동일한 중심을 사용하는 것이 가장 간단한 방법입니다. 이런 식으로 할 수 있습니다

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

이것은 슈퍼 뷰의 관점에서 서브 뷰를 중앙에 위치시킵니다. 위의 경우 원점이 (0, 0)에 있기 때문에 작동합니다.
Abdurrahman Mubeen Ali

3

를 사용하여 PureLayout을 사용하는 또 다른 솔루션입니다 autoCenterInSuperview.

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

[outerview addSubview:innerView];

[innerView autoCenterInSuperview];

이것이 다음과 같은 모습입니다.

PureLayout 센터


2

c # 또는 Xamarin.ios에서는 다음과 같이 사용할 수 있습니다

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


1

나는 사용할 것이다 :

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

이것은 간단하고 짧으며 달콤합니다. 위의 @ Hejazi의 답변을 사용하고 하위보기 parent.center이외 (0,0)의 것으로 설정된 경우 중앙에 있지 않습니다!


0
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.