codememo

자동 배치 - 절반의 수퍼뷰 높이를 기준으로 높이 설정

tipmemo 2023. 5. 3. 21:28
반응형

자동 배치 - 절반의 수퍼뷰 높이를 기준으로 높이 설정

최근에 자동 레이아웃에 들어갔고 저는 정말 사소한 문제 사례처럼 보이는 것에 갇혀 있습니다.화면 맨 위에 앉아서 화면 높이의 절반을 차지하고 싶다는 견해가 있습니다.자동 레이아웃 전에 간단히 - 제자리에 고정하고 수퍼 뷰 크기가 조정될 때 수직으로 확장하도록 지시합니다.

이제, 어떻게 해야 할지 모르겠어요.설정을 시도하면 다음과 같은 결과를 얻을 수 있습니다.

자동 배치 블루스

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

한동안 고심한 끝에 제가 생각할 수 있는 유일한 방법은 이 뷰 아래에 다른 뷰를 소개하고 높이를 동일하게 고정한 다음 서로 위와 아래에 앉게 한 다음 두 번째(아래) 뷰가 보이지 않도록 설정하는 것입니다.좀 못생기게 보이네요!

제가 뭔가 명백한 것을 놓쳤나요?

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

높이 동일 제약 조건 설정

이제:

제약 조건의 승수 편집

이익!!!

결과

추신. 또한 이 방법은 서로 다른 내포 수준에 대한 뷰와 (분명히) 너비에 적용되는 뷰에서 작동합니다.

P.P.S. 때로는 제약 조건의 "첫 번째 항목과 두 번째 항목"을 반대로 설정하거나 역 승수를 설정하는 것이 유용할 수 있습니다(예: 0.5 대신 2). (그러나 이러한 방법은 보기가 서로 어떻게 관련되는지 이해하지 못하는 경우에는 유용하지 않습니다).

이것은 [적어도] Xcode 5.1.1 이후 IB에서 가능합니다.비록 제가 그것이 실제로 매우 간단하다는 것을 깨닫는 데 시간이 좀 걸렸지만:

먼저 기본 상단 정렬 제약 조건을 작성합니다(일반적인 경우처럼 하단, 왼쪽 및 오른쪽 제약 조건도 설정해야 합니다).그런 다음 제약 조건을 선택하고 속성 검사기로 이동합니다.

위 단계 시연

그러면 승수를 조정할 수 있습니다.만약 당신이 그것을 원한다면 수퍼 뷰의 50%를 남겨둡니다.1슈퍼의 중심에 따라 정렬되어 있기 때문입니다.이는 또한 다른 비율의 보기(슈퍼 보기의 25%와 같은)를 만들 수 있는 훌륭한 방법입니다.

위의 두 번째 단계 시연

시간이 좀 더 흐른 후에 저는 다음과 같은 생각을 해냈습니다.

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

- (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];

}

기본적으로 자신의 높이에 대해 0.5의 승수를 설정합니다.보기, 위쪽 보기에 대해 작업합니다.제약 조건 위반에 대한 런타임 메시지가 많이 표시되지 않도록 IB의 맨 아래 수직 공간 제약 조건의 우선 순위를 1000보다 낮게 설정해야 했습니다.

그래서 누가 인터페이스 빌더에서 이것을 어떻게 하는지 보여줄 수 있다면, 그것은 제 질문에 대답하는 것이 더 나을 것입니다. 그렇지 않으면 이것은 (현재로서는) 얻는 것만큼 좋은 것 같습니다.??

Fyodor Volchook의 답변보다 조금 더 쉽고 간단한 방법 -제어버튼을 누른 상태에서 서브뷰를 클릭합니다. -명령버튼을 누른 상태에서 커서를 슈퍼뷰로 드래그한 후 슈퍼뷰를 클릭합니다. -"Aspect Ratio"를 선택합니다.

여기에 이미지 설명 입력

- 그런 다음 크기 관리자를 클릭합니다. - 그런 다음 제약 조건을 두 번 클릭합니다.여기에 이미지 설명 입력

- 두 항목 모두에 대해 "높이"가 선택되어 있는지 확인합니다.여기에 이미지 설명 입력

- 그런 다음 화면의 절반 또는 원하는 부분에 대해 "곱하기"를 0.5로 변경합니다.여기에 이미지 설명 입력

코드에서 두 뷰 모두 동일한 높이를 가져야 하는 두 뷰의 경우 다른 가능성이 있습니다. 즉, 뷰2의 높이를 뷰1의 높이로 설정하기만 하면 됩니다(여기서의 요령은 뷰1의 높이를 명시적으로 설정하지 않는 것입니다).

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

메테의 대답의 빠른 버전:

    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)


}

언급URL : https://stackoverflow.com/questions/14935825/autolayout-make-height-of-view-relative-to-half-superview-height

반응형