자동 레이아웃-절반 슈퍼 뷰 높이를 기준으로 시야 높이를 만듭니다.


136

최근 자동 레이아웃에 들어 갔으며 실제로 사소한 문제의 예처럼 보입니다. 화면 상단에 앉아 화면 높이의 절반을 차지할 수 있습니다. 자동 레이아웃 전에 간단하게-제자리에 고정하고 슈퍼 뷰 크기가 조정될 때 세로로 확장하도록 지시합니다.

지금, 나는 내 삶을 위해 그것을하는 방법을 볼 수 없습니다. 이것을 설정하려고하면 얻을 수있는 내용은 다음과 같습니다.

자동 레이아웃 블루스

하단 공간 제약 조건은 "284와 같음"으로 설정되어 있습니다. 이는 iPhone4 레이아웃으로 변경할 때 화면 하단에 284 포인트 공간을 유지하고 더 이상 절반이되지 않도록 뷰를 축소하므로 절대적이고 쓸모가 없습니다. 화면의 크기. 그리고 그 제약 조건을 다른 뷰 높이의 일부와 동일하게 설정하는 방법은 없습니다.

잠시 동안 어려움을 겪고 나서이 생각을 할 수있는 유일한 방법은이보기 아래에 다른보기를 도입하고 높이를 똑같이 고정하고 서로 위아래로 앉은 다음 두 번째 (아래)보기를 보이지 않게 설정하는 것입니다 .. 조금 추한 것 같습니다!

나는 분명한 것을 놓치고 있습니까? ..


1
나는 그것이 추악하다고 생각하지 않지만 IB를 사용하여 원하는 것을 얻는 현명한 트릭입니다. 나는 이것을했고, 당신이 적절한 요소 이름을 사용할 때, 당신은 무슨 일이 일어나고 있는지 명확하게 할 수 있습니다. 이 두 하위 뷰를 기반으로 다른 위치 또는 중심에서 세 번째 요소를 변경하여 크기를 변경할 수도 있습니다.
Jelle

답변:


167

이것은 적어도 Xcode 5.1.1부터 IB에서 가능하다. 알아내는 데 시간이 걸렸지 만 실제로는 매우 간단합니다.

먼저 기본 상단 정렬 구속 조건을 작성하십시오 (정상과 같이 하단, 왼쪽 및 오른쪽 구속 조건도 설정해야 함). 그런 다음 제약 조건을 선택하고 속성 관리자로 이동합니다 .

위의 단계 데모

그런 다음 승수를 조정할 수 있습니다. 수퍼 뷰의 50 %를 원한다면 1수퍼의 중심에 맞춰 정렬되어 있기 때문에에 그대로 두십시오 . 또한 다른 비율 (예 : 수퍼 뷰의 25 %) 인 뷰를 생성 할 수있는 좋은 방법입니다.

위의 두 번째 단계 시연


좋은 :)이 게시물은 허용 대답으로 표시해야한다고 생각 :) 아이폰 OS 개발자는 종종 솔루션 코드와 같은보다는 인터페이스 빌더 솔루션을 선호
hqt

@hqt, 감사합니다. 수락 된 답변이 작성되었을 때이 방법을 사용할 수 없었습니다. 때때로 요청자는 이전 질문을 다시 보거나 수락 된 답변을 변경하기 위해주의하지 않습니다. 그러나 궁극적으로 나는 돕기 위해 여기에 있습니다.
Firo

3
조금 혼란 스러워요. 나는 이것을 시도했지만 뷰를 수퍼 뷰의 중심에두고 뷰의 높이를 조정하지 않습니다.
Dean

@Dean, 당신은이 있는지 확인해야 할 First Item것입니다 View.Top없습니다 View.Center Y. 그렇지 않으면, 그것은 단지 중앙에 있습니다. 또한 뷰의 다른 모서리를 처리하기 위해 다른 구속 조건이 올바르게 설정되어 있는지 확인해야합니다.
Firo

1
View.Top은 Superview와 같습니다. Center Y multiplier 1은 높이를 제공하지 않습니다. 이 답변은 불완전합니다. 당신이해야 할 것은 당신이하는 말에 대해 생각하는 것입니다. 이 답변을 편집하여 다른 제약 조건을 명확하게 설명합니다.
smileBot

184

모든보기간에 정확한 비율을 설정할 수있는 스토리 보드 솔루션 :

높이 동등 구속 조건 설정

지금:

구속 조건의 승수 편집

이익!!!

결과

추신 : 또한이 방법은 다른 중첩 수준의 뷰에서 작동하며 너비에 적용 가능합니다 (분명히)

PPS는 때때로 제약 조건의 "첫 번째 항목과 두 번째 항목을 역전시키는 것"또는 역 승수를 설정하는 것이 도움이 될 수 있습니다 (예 : 0.5 대신 2).


1
2 단계는 효과가없는 것 같습니다. '여백에 제약 조건'을 토글하는 것을 제외하고는 패널에서 아무것도 선택할 수 없습니다. UITableViewCell에서 UIImageView의 너비를 콘텐츠보기의 50 %로 설정하려고합니다.
DrMickeyLauer

2
업데이트 : 분명히 인터페이스 빌더는 내용보기가 자동 레이아웃 제약 조건의 명시 적 대상이되도록 허용하지 않습니다. 이 작업을 수행하려면 컨텐츠 뷰의 하위로 더미 서브 뷰를 삽입해야합니다.
DrMickeyLauer 2014

1
그것은 나를 위해 작동합니다. 빌더 화면이 아닌 목록에서 두 개의보기를 선택해야합니다. 백분율의 경우 배율을 더 작은보기 25, 큰보기 135-25 / 135 = 0.185로 얻기 위해 작은보기를 큰보기로 나눕니다. 보기를 얻을 수있는 승수 값으로서 설정하는 것이 X1과 X2 = 25 만 등 6 크고 6 플러스와 스케일 업시
latenitecoder

1
이것은 나를 위해 일했지만
서브

이것이 정답입니다. 먼저 답변을 받아보십시오. 그것은 작동하지 않았고 아래로 스크롤 하여이 답변을 보았습니다. 감사!
Mihir Oza

31

조금 더 시간을 보낸 후 나는 다음을 생각해 냈습니다.

나는 그것을 대답으로 지적하고 있지만 실제로 인터페이스 빌더 에서이 작업을 수행 할 수 없다고 가정하기 때문에 매우 만족스럽지 않지만 나중에 다음과 같이 올바른 제약 조건을 코드에 추가 할 수 있습니다.

- (void) viewWillAppear:(BOOL)animated
{

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview
                                                                 attribute:NSLayoutAttributeHeight 
                                                                 relatedBy:0 
                                                                    toItem:self.view
                                                                 attribute:NSLayoutAttributeHeight
                                                                multiplier:.5 
                                                                  constant:0];
    [self.view addConstraint:constraint];

}

기본적으로 상위 뷰에서 작동하는 self.view의 높이에 대해 배율을 0.5로 설정합니다. 제약 조건을 깨는 것에 대한 런타임 메시지가 많이 발생하지 않도록 IB의 하단 수직 공간 제약 조건의 우선 순위를 1000보다 낮게 설정해야했습니다.

그래서 누군가 인터페이스 빌더 에서이 작업을 수행하는 방법을 보여줄 수 있다면, 내 질문에 더 잘 대답 할 것입니다. 그렇지 않으면 이것이 현재 (현재)만큼 좋을 것 같아요?


3
나는 이것이 지금처럼 좋은 것이라고 생각합니다. Apple이 IB의 승수 값에 액세스 할 수 있다면 좋을 것이므로 상수뿐만 아니라 설정할 수도 있습니다.
rdelmar

3
이 답변을 보는 사람이라면 누구나 Xcode 5.1에서 Interface Builder를 통해 승수를 설정할 수 있습니다. 이제 IB를 통해 전체 수퍼 뷰 높이의 절반 인 뷰를 구성 할 수 있습니다.
Mark Krenek

9

Fyodor Volchyok의 답변보다 방법보다 약간 쉽고 간단합니다. -제어 버튼을 누른 상태에서 서브 뷰를 클릭하십시오. -명령 단추를 누른 상태에서 커서를 수퍼 뷰로 끈 다음 수퍼 뷰를 클릭하십시오. "종횡비"를 선택하십시오.

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

그런 다음 크기 검사기를 클릭하십시오. 그런 다음 제약 조건을 두 번 클릭하십시오. 여기에 이미지 설명을 입력하십시오

-두 항목 모두에 "높이"가 선택되어 있는지 확인하십시오. 여기에 이미지 설명을 입력하십시오

그런 다음 화면의 절반 또는 원하는 수퍼 뷰의 일부에 대해 "승수"를 0.5로 변경하십시오. 여기에 이미지 설명을 입력하십시오


쉽고 빠른 접근! 고마워 친구
Abdullah Saeed 1

7

두 가지 뷰가 모두 동일한 높이를 가져야하는 경우에도 코드에서 또 다른 가능성이 있습니다 .view2의 높이를 view1의 높이로 설정하십시오 (여기의 트릭은 명시 적으로 view1의 높이를 명시 적으로 설정하지 않습니다).

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];

너비 / 높이와 같은 다른 뷰를 참조 할 수 있다는 것을 몰랐습니다. 이미 시각적 형식 언어를 사용하는 경우 가장 깨끗한 답변 IMO입니다.
loeschg


0

Mete의 답변의 신속한 버전 :

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



    upperView.translatesAutoresizingMaskIntoConstraints = false


    var constraint = NSLayoutConstraint(item: upperView,
                                        attribute: NSLayoutAttribute.top,
                                        relatedBy: NSLayoutRelation.equal,
                                        toItem: self.view,
                                        attribute: NSLayoutAttribute.top,
                                        multiplier: 1,
                                        constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.height,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.height,
                                    multiplier: 0.5,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.leading,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.leading,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


    constraint = NSLayoutConstraint(item: upperView,
                                    attribute: NSLayoutAttribute.trailing,
                                    relatedBy: NSLayoutRelation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutAttribute.trailing,
                                    multiplier: 1,
                                    constant: 0)

    self.view.addConstraint(constraint)


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