UIStackView 내부에 추가 된 뷰에 선행 패딩을 추가하는 방법


126

이것은 내 설정입니다. UIScrollView0으로 설정된 선행, 상단, 시도 에지가 있습니다.이 안에이 UIStackView제약 조건을 추가합니다 .

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

스택 뷰 안에 몇 가지 뷰를 추가합니다.
내 문제는 제약 조건으로 인해 스택 뷰에 추가 된 첫 번째 뷰도 리딩 에지 ​​= 0을 갖게된다는 것입니다.

첫 번째 뷰에 패딩을 추가 할 수있는 방법은 무엇입니까? 스크롤 뷰 제약을 조정하지 않고.


2
받아 들여지는 대답을 변경 하시겠습니까? Tolga의 대답은 훨씬 나아 보입니다.
Honey

답변:


26

제공 한 솔루션은 (질문에서 원하는대로) UIStackView 내부에 뷰에 패딩을 추가하지 않지만 UIStackView에 대한 선행을 추가합니다.

해결책은 원래 UIStackView 내부에 다른 UIStackView를 추가하고이 새로운 UIStackVIew를 유도하는 것입니다. 그런 다음이 새로운 UIStackView에 뷰를 추가합니다.

힌트, 당신은 완전히 Interface Builder를 사용하여 할 수 있습니다. 즉, 코드를 작성할 필요가 없습니다.


374

경우 isLayoutMarginsRelativeArrangement속성이 참 스택 뷰 레이아웃 마진에 대하여 그 배치 뷰 레이아웃된다.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

그러나 스택 뷰 내부의 모든 정렬 된 뷰에 영향을줍니다. 이 패딩을 하나의 정렬 된 뷰에만 적용하려면 중첩 된 뷰를 사용해야합니다.UIStackView


2
isLayoutMarginsRelativeArrangementgetter이고 setter는 layoutMarginsRelativeArrangement입니다. 나는 대답 편집 할 수 없습니다
maross

5
@maross Swift에서 getter와 setter 함수에는 차이가 없습니다. 하지만 당신이 맞습니다. Objective-C로 개발하는 사람들은 layoutMarginsRelativeArrangement대신 사용해야 합니다. 공식 문서 : developer.apple.com/reference/uikit/uistackview/...
톨가 오쿠 르

3
Objective-C :stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto

4
2019 년 2 월 자정에 사무실에 앉아 있습니다. 이러한 답변은 나에게 앞으로 나아갈 힘을줍니다. 감사합니다 @tolpp
nefarianblack

156

제약 조건이 스택 뷰 내에서 작동하지 않거나 다소 이상하게 보입니다.

(예를 들어 이미지 스택 뷰에서 선택한 항목에 선행 / 후행 제약 조건을 추가하면 collectionview에도 선행을 추가하지만 후행은 추가하지 않으며 확실히 충돌합니다).

stackview 내부의 stackview

stackview 내의 모든보기에 대한 레이아웃 여백을 설정하려면 다음을 선택합니다.

Stack View > Size Inspector > Layout Margins > Fixed

참고 : 스크린 샷에서 볼 수 있듯이 "Fixed"옵션은 이전에라고했습니다 "Explicit".

그런 다음 패딩을 추가하십시오.

스토리 보드


23
애플이 숨기는 것 중 하나. 나는 Xcode가 좋고 친절하며 쉬움과 반대되는 방식이 싫어요. 감사합니다
오리

명시적인 레이아웃 여백을 변경하면 Xcode가 계속 충돌합니다. 버그를 신고했지만 중복이라고 답했습니다.
mvandillen

UI에서 찾을 수 없었던 것입니다. 스택보기 여백에 대한 필드를 보려면 레이아웃 여백을 명시 적으로 변경합니다.
pkamb

13
FYI XCode 9는 이제 이것을 "명시 적"대신 "고정"이라고 부릅니다.
Mel

또한 Xcode 9에서는 파일 검사기에서 "안전 영역 레이아웃 가이드 사용"을 선택 해제하십시오. 작성 시점에서 여전히 IB에서 많은 문제를 유발하고 제약 조건에 대해 일반 레이아웃 가이드를 따르십시오.
PJ_Finnegan

16

나를 위해 일한 것은 스페이서 인 다른 UIView를 스택 뷰에 추가하는 것입니다 (적어도 stackView.distribution = .Fill에서 작동합니다).

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

6

신속한 3 : 다음과 같이 오프셋 설정이 필요합니다.

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

이 제약 조건이 설정되었는지 확인하십시오. parentView.addArrangdSubView(firstView)


4

선행 패딩 만 필요한 경우 스택 뷰의 정렬을 "Trailing"으로 설정하면 포함 된 각 하위 뷰에 고유 한 선행 제약 조건을 자유롭게 지정할 수 있습니다.

보너스로 스택 뷰의 정렬을 "중앙"으로 설정 한 다음 선행 및 / 또는 후행 제약 조건을 사용하여 각 항목에 양쪽에 자체 패딩을 제공 할 수 있습니다.


1

이 질문에는 이미 좋은 답변이 있습니다. 한 가지 제안은 spacing속성을 사용 하여보기 사이의 간격을 설정합니다. 첫 번째 및 마지막 뷰의 경우 @tolpp가 ​​제안한대로 삽입을 설정하거나 패딩을 추가하기 위해 상수로 부모 (스택 뷰)에 제약 조건을 추가하는 두 가지 옵션이있을 수 있습니다.


0

우리가 한 일은 UIStackView의 첫 번째 자식과 마지막 자식으로 투명한 구성 요소 (예 : UIButton / UIView)를 추가하는 것입니다. 그런 다음 이러한 보이지 않는 자식의 너비를 제한하여 패딩을 조정합니다.


0

해결책은 제약 조건을 추가하려는 뷰를 유지하기 위해 스택 뷰에 일반 뷰를 보유한 다음 스택 뷰의 뷰와 관련된 항목에 대한 제약 조건을 추가하는 것입니다. 이렇게하면 원래 뷰가 스택 뷰 내에서 선행 및 후행 제약 조건을 가질 수 있습니다.

이것은 인터페이스 빌더에서 프로그래밍 방식으로 수행 할 수 있습니다.


-3

해결책은 매우 간단한 것 같습니다. 대신에:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

나는 방금 썼다.

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

1
실제로 코드는이 (질문 상태로), 당신의 uistackview 내부 귀하의 의견에 대한 패딩을 추가하지 않습니다 a를 urscrollview 내부의 uistackview에 대한 주요 추가
윌리엄 Kinaan

네,하지만 패딩을 추가 할 수 있는지 모르겠습니다.
Adrian

첫 번째로, 다른 uistackview가 원래 uistackview에 들어가서 패딩을 줄 수 있습니다. 다음이 새로운 uistackview에 귀하의 의견을 추가 (당신은 인터페이스 빌더, 그것을위한 코드를 작성 할 필요에 의해 완전히 그렇게 할 수 있습니다)
윌리엄 Kinaan

예, 작동합니다. 답변으로 추가 할 수 있으며 동의합니다.
Adrian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.