나는 사용하려는 새 [자동 레이아웃뿐만] (http://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AutolayoutPG/Articles/Introduction.html) 의 사자 때문에 상당히 좋은 것 같다. 하지만 내가 좋은 일을 하고 방법에 대한 정보를 찾을 수 없습니다. 예를 들면 다음과 같습니다.
저도 두 레이블:
+----------------+
| +------------+ |
| + label 1 | |
| +------------+ |
| |
| +------------+ |
| | label 2 | |
| +------------+ |
+----------------+
하지만 처음 레이블에만 가 장착된 것이 항상 컨텐트나 가끔 좁히어 ist 그냥 내용이 없는 일이다. 내가 할 일은 이런 때 자동으로 볼 수 있는 레이블 2 레이블에만 1 약간만이라도 좋았을 거라는 컨텐트입니다.
+----------------+
| +------------+ |
| + label 2 | |
| +------------+ |
| |
| |
| |
| |
+----------------+
그래서 나는 어떤 제약을 추가하는 아니하였으매 함께 자동으로 작동하잖아 오토라리우스? 내가 모든 것을 할 수 있다는 사실을 알고 있지만, 나는 그냥 코드 등 다양한 스타일과 날까로움 있는 레이블 및 이미지 및 단추 등 30 여명이 모두 선택, t # 39 의 코드는 훈트레츠 don& 쉐퍼드도 추가할 때 자동으로 너무 꽤 잘 할 수도 있다.
그럼 그냥 사용 및 함께 할 수 없는 경우 작동합니까 내아기마저도 웹보기 HTML 과 CSS.
이것이 가능한 있지만, t # 39 와 자동 레이아웃뿐만 doesn& 정확히요 배율입니다 설명이다.
그래서 감안할 때, 당신은 당신의 acrobatconnectcentral. let& s # 39 라고 레이블링합니다 및 레이블 B (또는 단추 또는 다른 사항은요 상행담관염이라고). 최고 구속 후 처음 시작 사이의 수직 간격을 추가하기만 A, b 는 a 에 대한 구속 superview 이 모든 일반 부진했다. 이 시점에서, B 는 모호한 레이아웃뿐만 조교하실 경우 지루려면 있을 것이라고 말했다. # 39 의 경우 그것을 숨기기 위해 여전히 조교하실 it& 공간 사이의 공간을 차지하는 등 축제.
다음 다른 구속, B 에서 맨 위로 superview 추가해야 합니다. 우선 변경하십시오 여기있을 스크램블된 보다 다른 사람 (말하도다 900) 및 설정한 후 # 39 의 상수입니다 스크램블된 it& 표준 (또는 다른 값이 작을수록). 이제 제거될 때 it& # 39 킥, s 는 B 에 대한 구속 및 당기십시오 superview, 낮은 우선 순위를 지켰다. 구속 모습이.
[인터페이스입니다 구성기는 스크린샷] (https://i.stack.imgur.com/cTqx8.png)!
이와 함께 이 문제를 오래 할 때 단순화표현 않했노라 레이블 목록.
유아벨 하위 본질적인 해결책은 그냥 하나의 단순한 콘텐츠 및 변경하십시오 크기.
@implementation WBSCollapsingLabel
- (CGSize)intrinsicContentSize
{
if (self.isHidden) {
return CGSizeMake(UIViewNoIntrinsicMetric, 0.0f);
} else {
return [super intrinsicContentSize];
}
}
- (void)setHidden:(BOOL)hidden
{
[super setHidden:hidden];
[self updateConstraintsIfNeeded];
[self layoutIfNeeded];
}
@end
+----------------+
| +------------+ |
| + label 1 | |
| +------------+ |
| ^ |
| ^ !
| +------------+ |
| | label 2 | |
| +------------+ |
+----------------+
방법을 알고 있는 경우 - 1 은 거리 구속을 레이블에만 오토라리우스 ^ it& 될 때, # 39 의 구체화하십시오 비워집니다 제로 세로폭 you& # 39, re 계속 프레젠테이션이든:
+----------------+
| +------------+ |
| ^ |
| ^ !
| +------------+ |
| | label 2 | |
| +------------+ |
+----------------+
하지만 이 모든 어려움을 겪고 있는 지금, ve 구분되어 있는 하위 산라벨 수행됨 you& # 39 자동차 크기 구속조건으로 객체에는 통해 만들어진 않고 수동으로 인텔®visual 언어 및 벤드된 산레이우스컨스트레인스 벗어난 것이다.
예를 들어 내가 어떻게 이 프로그램을 통해 처리됩니까 here& # 39 을 사용하지 않고 인터페이스입니다 구성기는. 요약하자면, # 39 의 활성화됨 그리곤요 반복할 경우 추가 단지 보기입니다 it& 수브리우스, 추가 수직 구속을 as I go.
참고로, 보기에 질문 초기화되며 이에 앞서.
/*
Begin Auto Layout
*/
NSMutableArray *constraints = [NSMutableArray array];
NSMutableDictionary *views = [[NSMutableDictionary alloc] init];
/*
Label One
*/
if (enableLabelOne) {
[contentView addSubview:self.labelOne];
self.labelOne.translatesAutoresizingMaskIntoConstraints = NO;
[views setObject:self.labelOne
forKey:@"_labelOne"];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_labelOne(44)]"
options:0
metrics:nil
views:views]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_labelOne]-|"
options:0
metrics:nil
views:views]];
}
/*
Label Two
*/
if (enableLabelTwo) {
[contentView addSubview:self.labelTwo];
self.labelTwo.translatesAutoresizingMaskIntoConstraints = NO;
[views setObject:self.labelTwo
forKey:@"_labelTwo"];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_labelTwo(44)]"
options:0
metrics:nil
views:views]];
}
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_labelTwo]-|"
options:0
metrics:nil
views:views]];
/*
Dynamically add vertical spacing constraints to subviews
*/
NSArray *subviews = [contentView subviews];
if ([subviews count] > 0) {
UIView *firstView = [subviews objectAtIndex:0];
UIView *secondView = nil;
UIView *lastView = [subviews lastObject];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[firstView]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(firstView)]];
for (int i = 1; i < [subviews count]; i++) {
secondView = [subviews objectAtIndex:i];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[firstView]-10-[secondView]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(firstView, secondView)]];
firstView = secondView;
}
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lastView]-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(lastView)]];
}
[self addConstraints:constraints];
당초 이 내가 구현됩니까 따라 이 스택 오버플로입니다 오토메이티드 와 내 필요에 맞게 변경할 것을.
I found a 제믈랭글리 제대로 된 방법으로 이 잘 알려져 있다. # 39 의 it& 비슷한 [David& # 39 의] (https://stackoverflow.com/a/12000666/902968). # 39 의 here& 어떻게 작동하잖아 코드. 하지만, 내가 만들어 superview 및 모든 it& # 39 의 수브리우스 수준들과 항상 않았을 수 있다. 난 또 많은 제약 등 'V: - [_btn]' 을 superview. 알 수 있듯이 이러한 구속이 맨 끝에 있는 superview https://partner. microsoft. 없다. 그런 다음 두 가지 모두에 대해 구속 어레이에는 창조하 a & # 39 더 상태를 보기인 가져다줄래요 차이는 Options& # 39;; 삼각형. # 39 의 삼각형을 눌렀을 때 보라그들은 it& 따라 제한 및 그에 따라 추가 및 분리하십시오 스테이드 내가 수브리우스. 예를 들어, 추가 나는한다:
[self.backgroundView removeConstraints:self.lessOptionsConstraints];
[self.backgroundView addSubview:self.nameField];
[self.backgroundView addConstraints:self.moreOptionsConstraints];
I like '버튼을 묶임 구속 제거되었으면 하단으로 superview V: [_btn] -'. I look like '구속 (추가되든지 v: [_btn] - [_namefield] -' 이 곳에서 볼 수 있듯이 원래 보기 보기 그 위에 새로운 구속 및 그 사이에 있는 높이, s # 39 는 superview& superview 하단에.
첫째, 이 레이아웃 사용 안 함.
V:|-?-[Label1]-10-[Label2]-10-|
H:|-?-[Label1]-?-|
H:|-20-[Label2]-20-|
이 이름:
("|" is the real (outer) container)
V:|-?-[Label1]-0-[Label2HideableMarginContainer]-0-|
H:|-?-[Label1]-?-|
H:|-0-[Label2HideableMarginContainer]-0-|
("|" is Label2HideableMarginContainer)
V:|-10-[Label2]-10-|
H:|-20-[Label2]-20-|
그래서 우리는 무엇을 수행되 지금? '직접' 에 사용된 레이아웃 Label2 아니다. # 39, 'a' s 여백 컨테이너입니다 it& 배치합니다. , Label2 '의' 로 사용되고 있는 컨테이너입니다 가상본 여유폭 0 인 레이아웃의. '여백 컨테이너입니다' 의 실제 여유폭 동일팔레트에 인사이드라면 있다.
이제 Label2 숨기십시오 '' 을 (를):
및
아마 좀 복잡하지만 한번 개발할 수 밖에 없습니다. 모든 로직은 넣을 때마다 별도의 배치하고, smg 재사용됩니다 숨길 필요가 있습니다.
다음은 C # 의 기반이 되는 자 마린 (s) 를 구하는 코드를 어떻게 이러한 구속이 서브비에프 안쪽 가장자리에 '여백 컨테이너입니다' view:
public List<NSLayoutConstraint> SubConstraints { get; private set; }
private void ReadSubContraints()
{
var constraints = View.Constraints; // View: the Margin-Container NSView
if(constraints?.Any() ?? false)
{
SubConstraints = constraints.Where((NSLayoutConstraint c) => {
var predicate =
c.FirstAttribute == NSLayoutAttribute.Top ||
c.FirstAttribute == NSLayoutAttribute.Bottom ||
c.FirstAttribute == NSLayoutAttribute.Leading ||
c.FirstAttribute == NSLayoutAttribute.Trailing;
predicate &= ViewAndSubviews.Contains(c.FirstItem); // ViewAndSubviews: The View and View.Subviews
predicate &= ViewAndSubviews.Contains(c.SecondItem);
return predicate;
}).ToList();
}
}
프로그래밍 방식으로 이 문제를 해결했다. I have a 몇 踰꾪듉 연속 숨기십시오 언제든지 내가 한 결정을 내릴 수 있습니다.
사용되는 [지도학] (https://github.com/robb/Cartography) '숨겨진' 변화를 때마다 그들을 대체하기 위해 이들을.
let buttons = self.buttons!.filter { button in
return !button.hidden
}
constrain(buttons, replace: self.constraintGroup) { buttons in
let superview = buttons.first!.superview!
buttons.first!.left == superview.left
for var i = 1; i < buttons.count; i++ {
buttons[i].left == buttons[i-1].right + 10
}
buttons.last!.right == superview.right
}