프로그래밍 방식으로 UIView의 고정 높이 제약 조건을 업데이트하는 방법은 무엇입니까?


102

나는이 UIView내가 엑스 코드 인터페이스 빌더를 사용하여 제약 조건을 설정합니다.

이제 UIView's프로그래밍 방식으로 높이 상수 를 업데이트해야합니다 .

와 같은 기능이 myUIView.updateConstraints()있지만 사용 방법을 모르겠습니다.


높이 제약
벗어나

이 링크 또는 이 링크 를 참조 용으로 사용할 수 있습니다 .
Amna 인 Farhan

단일 또는 다중 제약 조건을 업데이트하는 방법은 다음과 같습니다. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

답변:


217

인터페이스 빌더에서 높이 제약 조건을 선택하고 출구를 가져옵니다. 따라서 뷰의 높이를 변경하려면 아래 코드를 사용할 수 있습니다.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

메서드 updateConstraints()는의 인스턴스 메서드입니다 UIView. 프로그래밍 방식으로 제약 조건을 설정할 때 유용합니다. 뷰에 대한 제약 조건을 업데이트합니다. 자세한 내용은 여기를 클릭 하십시오 .


58
오늘 저는 Constraints가 출구로 바뀔 수 있다는 것을 배웠고 거기에서 제가 원하는 것은 무엇이든 할 수 있습니다. 감사합니다
크리스 미켈

@ParthAdroja는, 동생은 내 질문에 대해 살펴 보시기 바랍니다 수 stackoverflow.com/questions/46034278/...를 ?
May Phyu 2017 년

xib 파일이 없으며 UIView에서 프로그래밍 방식으로 yourHeightConstraint를 설정하는 방법은 무엇입니까?
Newszer

@newszer 당신은 그것을 위해 다른 항목을 볼 필요가 stackoverflow.com/questions/31651022/...
Parth Adroja에게

상수 제약을 변경 한 후 layoutIfNeeded를 호출해야한다고 들었습니다. 왜? 때로는 viewWillLayoutSubviews 및 viewDidLayoutSubviews 내에서 layoutIfNeeded를 호출합니다. 괜찮아?
mnemonic23

104

여러 제약 조건이있는 뷰가있는 경우 여러 출력을 만들지 않고도 훨씬 더 쉬운 방법은 다음과 같습니다.

인터페이스 빌더에서 식별자를 수정하려는 각 제약 조건을 지정하십시오.

여기에 이미지 설명 입력

그런 다음 코드에서 다음과 같이 여러 제약 조건을 수정할 수 있습니다.

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

여러 제약 조건에 동일한 식별자를 제공하여 제약 조건을 그룹화하고 한 번에 모두 수정할 수 있습니다.


이것은 잘 작동하지만 제약 조건을 그룹화하기 위해 일반 콘센트 컬렉션을 사용하는 것이 더 쉽습니다. 예를 들어, 작업중인 뷰에는 47 개의 제약 조건이 있지만 런타임에 변경하려는 제약은 6 개뿐이므로 훨씬 더 작은 루프입니다. 이것은 또한 서로 다른 두 장소 사이에서 문자열을 동기화 할 필요가 없습니다.
Gary Z

1
이 팁에 대해 George에게 감사합니다. 내가 가지고 노는 현재 레이아웃에 대한 진정한 도움입니다.
Jim Hillhouse

1
BEAUTIFUL
윌리엄 양

안녕하세요, 저는 동일한 방식으로 사용하고 있지만 if 케이스에는 적용되지 않으며 동일한 식별자를 제공했습니다.
Rob13

제약에 이름을 붙일 수 있는지 궁금합니다. 좋은 대답입니다!
ShadeToD

35

변경 HeightConstraintWidthConstraint생성하지 않고 IBOutlet.

참고 : 스토리 보드 또는 XIB 파일에서 높이 또는 너비 제한을 지정하십시오. 이 확장을 사용하여이 Constraint를 가져온 후.

이 확장을 사용하여 높이 및 너비 제약 조건을 가져올 수 있습니다.

extension UIView {

var heightConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

당신이 사용할 수있는:

yourView.heightConstraint?.constant = newValue 

2
방법이 first(where: ...)바로 대신 사용할 수 filter+first
Vyachaslav Gerchicov

13

제약 조건을 VC에 IBOutlet으로 드래그합니다. 그런 다음 관련 값 (및 기타 속성, 설명서 확인)을 변경할 수 있습니다.

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
    // You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        self.myConstraint.constant = 10
        self.myView.layoutIfNeeded()
    }
}

9

원하는 경우 부드러운 애니메이션으로 제약 조건을 업데이트 할 수 있습니다. 아래 코드 덩어리를 참조하십시오.

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

위의 방법이 작동하지 않으면 Dispatch.main.async {} 블록에서 업데이트해야합니다. 그러면 layoutIfNeeded () 메서드를 호출 할 필요가 없습니다.


4

먼저 아래 코드와 같이 IBOutlet을 만들기 위해 뷰 컨트롤러에 높이 제약 조건을 연결합니다.

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

그런 다음 아래 코드를보기에 넣거나 어떤 작업이든

self.select_dateHeight.constant = 0 // we can change the height value

버튼 클릭 안에 있으면

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}

1

레이아웃 제약을 업데이트하려면 상수 속성을 업데이트하고 이후에 layoutIfNeeded를 호출하기 만하면됩니다.

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.

//Connect them from Interface 
@IBOutlet viewHeight: NSLayoutConstraint! 
@IBOutlet view: UIView!

private func updateViewHeight(height:Int){
   guard let aView = view, aViewHeight = viewHeight else{
      return
   }
   aViewHeight.constant = height
   aView.layoutIfNeeded()
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.