자동 배치 - 절반의 수퍼뷰 높이를 기준으로 높이 설정
최근에 자동 레이아웃에 들어갔고 저는 정말 사소한 문제 사례처럼 보이는 것에 갇혀 있습니다.화면 맨 위에 앉아서 화면 높이의 절반을 차지하고 싶다는 견해가 있습니다.자동 레이아웃 전에 간단히 - 제자리에 고정하고 수퍼 뷰 크기가 조정될 때 수직으로 확장하도록 지시합니다.
이제, 어떻게 해야 할지 모르겠어요.설정을 시도하면 다음과 같은 결과를 얻을 수 있습니다.

하단 공간 제약 조건이 "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
'codememo' 카테고리의 다른 글
| HTML 표의 단어 모음 (0) | 2023.05.03 |
|---|---|
| 'DOMAIN\MACHINE$' 사용자에 대한 로그인 실패 (0) | 2023.05.03 |
| 매우 큰 테이블에서 정확한 행 수를 계산하는 가장 빠른 방법은 무엇입니까? (0) | 2023.05.03 |
| PostgreSQL에서 보기에 대한 CREATE VIEW 코드를 보는 방법은 무엇입니까? (0) | 2023.05.03 |
| WPF에 "All Children loaded" 이벤트가 있습니까? (0) | 2023.05.03 |
