2013-01-07 45 views
8

Nếu tôi có chế độ xem trong ứng dụng của tôi với 3 bản phụ (ví dụ) với khoảng cách sau giữa chúng:Sử dụng Bố cục Tự động để thay đổi không gian bằng cách đổi kích thước

TOP - 40 points - SUBVIEW 1 - 60 points - SUBVIEW 2 - 80 điểm - SUBVIEW 3 - 80 điểm - BOTTOM

Tôi hiểu cách tôi có thể sử dụng bố cục tự động để đảm bảo mỗi tiểu sử của tôi giữ được chiều cao và chiều rộng, và tôi có thể nhận mọi thứ được căn chỉnh trên 3.5 HOẶC Màn hình iPhone 4 inch.


Nhưng tôi không thể làm việc ra những loại hạn chế tôi cần phải làm cho nó để nếu nó được liên kết với một 3,5" màn hình, và sau đó đã đi đến một 4" màn hình, mỗi khoảng cách sẽ tăng tương ứng (ví dụ: 40 điểm sẽ chuyển sang 47, 60 đến 71, 80 đến 95 - hoặc ở xa).

Điều này có khả thi không? Hay tôi cần phải làm cho tất cả các khoảng cách bằng nhau giữa các yếu tố? (Nếu vậy làm thế nào tôi sẽ vẫn nhận được nó để thay đổi kích thước như nhau không?)


Tôi mới để Auto Layout vì vậy nếu tôi đã bỏ lỡ bất cứ điều gì hết, hoặc đã không làm rõ những gì tôi có nghĩa là xin cho tôi biết, cảm ơn bạn.

Trả lời

1

Tôi không biết cách nào dễ dàng để thực hiện việc này. Tôi đã làm một nơi mà tất cả các không gian đều bằng nhau, nhưng để làm điều đó, tôi đã phải lấp đầy không gian với các nhãn vô hình (chỉ cần nhãn không có tiêu đề). Vì vậy, tôi đã có 4 đối tượng có thể nhìn thấy của tôi và 5 "nhãn spacer" tất cả các quyền trên đầu trang của mỗi khác. Tôi đã thực hiện 4 đối tượng có thể nhìn thấy tất cả đều có chiều cao rõ ràng, và miếng đệm không có chiều cao cố định, nhưng thiết lập để được tất cả như nhau:

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary]; 
    for (int i=1; i<5; i++) { // Labels with titles 
     UILabel *b = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 44)]; 
     b.text = @"This is my label"; 
     [b setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]]; 
    } 

    for (int i=1; i<6; i++) { // Spacer labels 
     UILabel *l = [[UILabel alloc ]init]; 
     [l setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [viewsDict setObject:l forKey:[NSString stringWithFormat:@"l%d",i]]; 
    } 

    for (id obj in viewsDict.allKeys) 
     [self.view addSubview:viewsDict[obj]]; 

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|" 
                    options:NSLayoutFormatAlignAllLeading 
                    metrics:nil 
                    views:viewsDict]; 


    NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[b1]" 
                    options:0 
                    metrics:nil 
                    views:viewsDict]; 


    [self.view addConstraints:constraints]; 
    [self.view addConstraints:constraints2]; 
} 

Để thực hiện các không gian khác nhau, tôi nghĩ rằng bạn phải sử dụng các hình thức dài hơn thể hiện ràng buộc, thay vì định dạng trực quan. Đoạn mã dưới đây có vẻ phù hợp với tôi. Tôi đang sử dụng cùng định nghĩa của các chế độ xem như trên, ngoại trừ việc tôi đã cắt số nhãn có tiêu đề thành 3 và miếng đệm thành 4 để khớp với câu hỏi của bạn. Khoảng cách tương đối phải giống như trong ví dụ của bạn, 2: 3: 4: 4.

NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:viewsDict[@"l1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b1"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b2"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con5 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con6 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"b3"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con7 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeTop multiplier:1 constant:0]; 
    NSLayoutConstraint *con8 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l4"] attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; 
    NSLayoutConstraint *con9 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l2"] attribute:NSLayoutAttributeHeight multiplier:.66 constant:0]; 
    NSLayoutConstraint *con10 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l3"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; 
    NSLayoutConstraint *con11 = [NSLayoutConstraint constraintWithItem:viewsDict[@"l1"] attribute:NSLayoutAttributeHeight relatedBy:0 toItem:viewsDict[@"l4"] attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; 
    NSLayoutConstraint *con12 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b1"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; 
    NSLayoutConstraint *con13 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b2"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; 
    NSLayoutConstraint *con14 = [NSLayoutConstraint constraintWithItem:viewsDict[@"b3"] attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:100]; 

    NSArray *constraints = @[con1,con2,con3,con4,con5,con6,con7,con8,con9,con10,con11,con12,con13,con14]; 
    [self.view addConstraints:constraints]; 
+0

Tuyệt vời, cảm ơn ý tưởng. Tôi sẽ thử nó và xem tôi có thể hack cái gì đó với nhau để tiếp cận cái tôi muốn không :) –

+0

Sau một chút học cách sử dụng Auto Layout, tôi đã quản lý thành công để sử dụng ý tưởng của bạn. Cảm ơn bạn! –

+0

Lời khuyên cho bất kỳ ai khác đang cố gắng này, kiểm tra không có bất kỳ giới hạn chiều cao được thêm tự động nào - vì điều này có thể dẫn đến chiều cao tổng thể lớn hơn kích thước màn hình khi xoay vòng. Nếu có, bạn chỉ có thể giảm mức độ ưu tiên của mình xuống dưới mức giới hạn chiều cao mà bạn muốn áp dụng. –

11

Bí quyết là để thêm không chỉ một mà HAI chế giữa quan điểm của bạn. Một với "Lớn hơn hoặc bằng" và một với "Ít hơn hoặc bằng". Kích thước tối thiểu (Greater Sau đó hoặc Equal) nên khoảng cách trên 3,5" nên là khoảng cách trên màn hình 4"

Ví dụ Màn hình Kích thước tối đa (Ít Rồi hoặc bình đẳng.":.

TOP - 40 điểm - subview 1-60 điểm - subview 2-80 điểm - subview 3-80 điểm - BOTTOM

TOP - SUBVIEW1:. Chọn cả hai trong Interface Builder Thêm chế "Vertical Spacing" hai Đặt một thành Lớn hơn Sau đó hoặc bằng 40. Đặt người kia thành Lesser Sau đó hoặc bằng 47.

Tổng của tất cả giá trị Lớn hơn + tất cả độ cao của chế độ xem của bạn phải là 480 pixel (3.5 ") Tổng của tất cả giá trị Sau đó, tất cả các chiều cao của các chế độ xem của bạn phải là 568 pixel (4")

+0

Tuyệt vời! Trong trường hợp của tôi đó là SuperView> = 0 đến SubView và SubView <= 106 đến SuperView – Jacksonkr

Các vấn đề liên quan