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

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

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

자동 레이아웃 블루스

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

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

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



답변

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

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

위의 단계 데모

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

위의 두 번째 단계 시연


답변

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

높이 동등 구속 조건 설정

지금:

구속 조건의 승수 편집

이익!!!

결과

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

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


답변

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

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

- (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보다 낮게 설정해야했습니다.

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


답변

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

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

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

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

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


답변

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

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


답변

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)


}


답변