programing

UIStackView 내에 추가된 보기에 선행 패딩을 추가하는 방법

newstyles 2023. 4. 24. 22:58

UIStackView 내에 추가된 보기에 선행 패딩을 추가하는 방법

설정은 다음과 같습니다.나는 가지고 있다.UIScrollView선행, 상단, 평가판 가장자리가 0으로 설정되어 있습니다.이 안에 내가 더하는 것은UIStackView다음과 같은 제약이 있습니다.

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

스택 뷰 내부에 뷰를 추가합니다.
문제는 제약 조건 때문에 스택 보기에 추가된 첫 번째 보기에도 선행 에지 = 0이 된다는 것입니다.

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

언제isLayoutMarginsRelativeArrangement특성이 참입니다. 스택 뷰는 레이아웃 여백에 따라 정렬된 뷰를 레이아웃합니다.

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

그러나 스택 뷰 내부의 모든 배열된 뷰에 영향을 미칩니다.정렬된 보기 하나에 대해서만 이 패딩을 사용하려면 중첩된 보기를 사용해야 합니다.UIStackView

Stack View에서는 제약이 기능하지 않거나 다소 이상하다는 것을 알게 되었습니다.

(예를 들어 이미지 스택 뷰에서 선택한 에 선행/추적 구속조건을 추가하면 collection view에도 선행/추적 구속조건이 추가되지만 후행은 추가되지 않으므로 확실히 충돌합니다).

스택뷰 내부 스택뷰

스택 뷰 내부의 모든 뷰에 대해 레이아웃 여백을 설정하려면 다음을 선택합니다.

Stack View > Size Inspector > Layout Margins > Fixed

주의:"Fixed"option은 이전에는"Explicit"(스크린샷 참조).

그런 다음 패딩을 추가합니다.

스토리보드

제공된 솔루션은 UIStackView 내에서 보기 패딩을 추가하는 것이 아니라 UIStackView에 대한 선행 정보를 추가합니다.

솔루션은 원래 UIStackView 내에 다른 UIStackView를 추가하여 이 새로운 UIStackVIew로 유도하는 것입니다.그런 다음 이 새로운 UIStackView에 뷰를 추가합니다.

힌트, 인터페이스 빌더를 사용하여 완전히 실행할 수 있습니다.즉, 코드를 쓸 필요가 없습니다.

스택 뷰에 스페이서(적어도 stackView.distribution = .Fill)인 다른 UIView를 추가하는 것이 효과가 있었습니다.

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

선행 패딩만 필요한 경우 스택뷰의 [Alignment]를 [Trailing]으로 설정하면 포함된 각 서브뷰에서 원하는 선행 구속조건을 자유롭게 지정할 수 있습니다.

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

스택 뷰 정렬을 "중앙"으로 설정합니다.그런 다음 모든 하위 뷰에 서로 다른 선행 및 후행 값을 지정할 수 있습니다.

swift 3: 다음 방법으로 오프셋을 설정하기만 하면 됩니다.

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

뒤에 .parentView.addArrangdSubView(firstView)

스택 뷰에 구속조건을 추가할 뷰를 유지하는 일반 뷰를 가진 후 스택뷰의 뷰에 상대적인 아이템에 구속조건을 추가할 수 있습니다.이렇게 하면 원래 뷰는 스택 뷰 내에서 선행 및 후행 제약 조건을 가질 수 있습니다.

이것은, 인터페이스 빌더로 프로그램적으로 실행할 수 있습니다.

에는 이미 답이 . 하나의 으로, 이 문제를 하세요.spacing속성: 보기 사이의 간격을 설정합니다.첫 번째 뷰와 마지막 뷰의 경우 insets를 @tolpp specommended로 설정하거나 부모(스택 뷰)에 대한 구속조건을 추가하여 패딩을 추가할 수 있습니다.

우리가 한 것은 투명한 컴포넌트(예: UIButton/)를 추가하는 것이었다.UIView)를 UIStackView의 첫 번째 및 마지막 아이로 지정합니다.그런 다음 이러한 보이지 않는 자식의 너비 제한을 설정하여 패딩을 조정합니다.

해결책은 꽤 간단했던 것 같다.대신:

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

그냥 이렇게 썼어요.

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

스택 뷰의 시작 부분에 빈 뷰를 추가합니다(폭 및/또는 높이 제한도 마찬가지입니다.

stackView.insertArrangedSubview(UIView().constrain(width: 0, height: 0), at: 0)

및/또는 마지막에:

stackView.addArrangedSubview(UIView().constrain(width: 0, height: 0))

다음과 같은 간단한 UIView 확장을 생성하여 제약조건을 추가했습니다.

extension UIView {
    func constrain(width: CGFloat, height: CGFloat) -> Self {
        NSLayoutConstraint.activate([
            widthAnchor.constraint(equalToConstant: width),
            heightAnchor.constraint(equalToConstant: height)
        ])

        return self
    }
}

언급URL : https://stackoverflow.com/questions/32551890/how-to-add-leading-padding-to-view-added-inside-an-uistackview