2014-11-16 3 views
2

상위 뷰의 맨 아래에서 레이블을 25 포인트 위로 이동시키는 자동 레이아웃 제약 조건을 프로그래밍 방식으로 만들었습니다. 이 장면에서 정의한 다른 제한 사항은 없습니다. 25는 대부분의 기기에서 문제가 없지만 iPhone 4에서는 너무 멀리 있습니다. 나는 그 화면 크기의 바닥에서 15 정도 위로하고 싶다. 그러나 모든 화면 크기에 대해 고정 값을 적용하거나 특정 화면 크기 하나를 변경하려고 시도하는 대신 변수 상수를 얻는 것이 훨씬 더 바람직하다고 생각했습니다. 그러나 자동 레이아웃에서는 이것이 불가능한 것처럼 보입니다. 그렇지?뷰의 높이 또는 화면 높이를 기반으로 NSLayoutConstraint 상수를 설정하십시오.

변수 상수를 얻는 한 가지 방법은 화면 (또는 뷰) 높이를 기준으로 값을 계산하는 것입니다. 예를 들어, 상수는 self.view.frame.size.height/30과 같습니다. iPhone 4 (세로 전용)에서는 16, iPhone 5는 거의 19 등입니다. 이것이 완벽 할 것입니다. 또는 다른 방법으로 높이의 3 %. 이러한 값은 높이가 변경 될 때 회전에 대해 동적이어야합니다.

일부 계산 또는 화면 /보기 높이를 기반으로하는 변수 상수가있는 자동 레이아웃 제약 조건을 사용할 수 있습니까? 아니면 고정 된 자동 레이아웃 상수를 피하면서 원하는 동작을 얻을 수있는 다른 솔루션이 있습니까?

여기 viewDidLoad에서, 몇 가지 예제 코드입니다 :

let footerLabel = UILabel() 
footerLabel.text = "my text" 
footerLabel.sizeToFit() 
footerLabel.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.view.addSubview(footerLabel) 
self.view.addConstraint(NSLayoutConstraint(item: footerLabel, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: -25)) 
self.view.addConstraint(NSLayoutConstraint(item: footerLabel, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)) 
+0

프로그래밍 방식으로 말하면 코드 또는 스토리 보드에서 제약 조건을 만들었다는 것을 의미합니까? – Spectravideo328

+0

@ Spectravideo328, 코드에서'viewDidLoad' – Joey

+0

그래서 사용할 수 없습니다 : self.myConstraint.constant = myVariableDistanceValue; – Spectravideo328

답변

1

I 화면 (또는 뷰)의 높이에 기초하여 값을 계산하는 것이다 가변 상수를 얻는 하나의 방법을 생각했다. 예를 들어, 상수는 self.view.frame.size.height/30.와 같습니다. iPhone 4 (세로 전용)에서는 16, iPhone 5는 거의 19 등입니다. 이것은 완벽 할 것입니다. . 또는 다른 방법으로 높이의 3 %. 이러한 값은 회전의 경우 동적이어야하며, 높이가 변경 될 수 있습니다.

self.view.addConstraint(NSLayoutConstraint(item: footerLabel, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 0.97, constant: 1)) 

상수 0을 유지하고 0.97에 승수를 변경하면 라벨의 하단에 항상보기 하단 3 % 높은 것을 의미합니다 :

당신은 단지에 첫 번째 제약 조건을 변경할 수 있습니다 .

+0

우수 답변! 당신은 내 하루를 만들었습니다. 나는 마침내 승수가하는 것을 배웠습니다. – Joey

1

당신은 설정 "스페이서"보기가있는 높이로 view의 3 %로 제한되어 있습니다.

override func viewDidLoad() { 
    super.viewDidLoad() 

    let label = UILabel() 
    let spacer = UIView() 

    label.setTranslatesAutoresizingMaskIntoConstraints(false) 
    spacer.setTranslatesAutoresizingMaskIntoConstraints(false) 
    spacer.hidden = true 

    view.addSubview(spacer) 
    view.addSubview(label) 
    var views = ["spacer":spacer, "label":label] 
    view.addConstraint(NSLayoutConstraint(item: spacer, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 0.03, constant: 0)) 
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label][spacer]|", options: nil, metrics: nil, views: views)) 

    view.addConstraint(NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0)) 

    label.backgroundColor = UIColor.purpleColor() 
    label.text = "THIS IS MY LABEL" 
} 
0

뷰에 직접 제약 조건을 할당하지 않겠습니다.

나는 것 :

  1. ,있는 viewDidLoad에서 당신의 NSLayoutConstraint
  2. 에 대한 변수 속성을 작성하고 초기화하는이 기능을 사용

    • (instancetype) constraintWithItem (ID) 뷰 1 를 속성 : (NSLayoutAttribute) attr1 relatedBy : (NSLayoutRelation) 관계 toItem : (id) view2 속성 (사용 self.view.addConstraint

    • 지정 다른 값을 이용하여보기로 제한 추가

  3. C (CGFloat) (CGFloat) 승산기 상수 (NSLayoutAttribute)는 승수 ATTR2. 상수)를 방위가 변경되거나 장치를 기반으로 할 때 해당 제약 조건에 적용합니다.

관련 문제