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

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

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



답변

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


답변

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

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

}

검은 색 사각형 원점과 중심이 부모와 같은 좌표에 맞습니다.

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

이제 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 세계로 변환하십시오”라고 말하고 있습니다.

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

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


답변

나는 사용할 것이다 :

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


답변

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


답변

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

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