2010-02-04 34 views
6

Tôi không chắc liệu "trình quản lý bố cục" có phải là cụm từ chính xác hay không, nhưng tôi đang tìm cách để UIViews chuyển sang chế độ xem phụ huynh, giống như div được thả nổi bên trái trong trang HTML. Có một cách dễ dàng để làm điều này, hoặc thông qua api iPhone hoặc một cái gì đó bên ngoài?iPhone - Trình quản lý bố cục cho UIViews?

+3

Được chỉ nghĩ điều tương tự. Một bộ sưu tập các LayoutManager như trong Java Swing sẽ rất hữu ích khi bạn thực sự không muốn bận tâm với InterfaceBuilder nhưng cũng không muốn phải đối phó với sự phức tạp của việc định vị mọi thứ bằng tay. – ra9r

+0

Chỉ có chế độ xem webkit nếu bạn chỉ muốn hiển thị nội dung. Tôi đã được rối tung xung quanh với nhúng html cho các công cụ màn hình thông tin độc đáo layed-out. – morgancodes

+0

Điều này không thực sự tồn tại trong iOS 5 trở về trước.Để biết thông tin về iOS 6, hãy tham khảo tài liệu được bảo vệ bởi NDA của bạn mà chúng tôi không thể thảo luận công khai tại đây. –

Trả lời

0

Tôi không biết API nào để thực hiện việc này. Core Animation trên Mac có một số công cụ bố cục nhưng tôi nghĩ nó không được đưa vào iPhone.

Những gì bạn mô tả không nghe có vẻ cực kỳ khó khăn. Mã nguồn mở nó? :-)

+1

Có! Tôi thường quá cẩu thả/lười biếng/ích kỷ vì bất kỳ ý định nguồn mở nào của tôi để đi bất cứ đâu. Nhưng có lẽ điều này sẽ khác nhau :) – morgancodes

1

Không có gì giống như điều này thực sự xây dựng vào sdk, nhưng nó không phải là quá khó để có được những hành vi bạn đang sau. Chỉ cần gọi

NSArray *subs = [parentView subviews]; 

để nhận tất cả các bản xem trước đã có. Vòng qua họ như

CGRect leftMostViewsFrame = nil; 
for(UIView *cur in subs){ 
    CGRect where = cur.frame; 
    //find the left most frame for a given X coord 
} 

và đặt quan điểm mới của bạn này bên cạnh nó

newView.frame = CGRectMake(leftMostViewsFrame.origin.x + leftMostViewsFrame.size.width, 
[parentView addSubview:newView]; 

......

Bạn có thể viết nó nhiều sạch hơn thế và có một rất nhiều kiểm tra và lý luận bạn cần phải làm để có được tất cả các hành vi của phao, nhưng đó là cách tiếp cận cơ bản tôi sẽ mất. Tôi không biết nếu có một bên thứ ba lib bạn có thể sử dụng hay không.

+1

Cảm ơn Joe, tôi sẽ tiếp tục và làm điều đó. – morgancodes

+0

@morgancodes Tôi đã viết một giải pháp hoàn chỉnh dựa trên câu trả lời này: http://stackoverflow.com/a/11379438/974531 –

2

Sau khi thực hiện một số tìm kiếm, tôi thấy điều này: http://code.google.com/p/layoutmanagers/ Phát triển lần cuối vào tháng 12 năm 2009 nhưng thoạt nhìn, có vẻ như vẫn có thể áp dụng cho các phiên bản iOS hiện tại.

+0

Tôi đã tạo một ngã ba ở trên trên github: https://github.com/RefuX/LayoutManagers-Fork và thêm GridLayout. Tôi đã sử dụng nó trên giao diện người dùng iPhone và iPad. Đối với iOS 4 và 5. Tôi thích nó :) – RefuX

1

Dưới đây là một giải pháp hoàn chỉnh (dựa trên the answer by Joe Cannatti):

  1. Thêm một UIView vào bảng phân cảnh của bạn, và liên kết nó với ViewController của bạn dưới một số tên, ví dụ container. (Trong trường hợp xem container của bạn là toàn bộ quan điểm, bạn có thể sử dụng self.view thay vì container trong ViewController.m của bạn.)

  2. Tạo và thêm yếu tố UI-container. Ví dụ, bạn có thể tạo và thêm một UILabel-container với:

    UILabel* label = [[UILabel alloc] init]; 
    label.text = @"Foo"; 
    [label sizeToFit]; 
    [container addSubview:label]; 
    
  3. Ban đầu, và bất cứ khi nào bạn thêm/xóa/sửa đổi các yếu tố giao diện người dùng đến/từ/trong container, bạn có thể tái sắp xếp chúng vào dòng chảy bố trí với:

    float x = 0, y = 0, width = container.frame.size.width, rowHeight = 0; 
    for (UIView* view in container.subviews) { 
        // only re-arrange user-added views (change condition as required) 
        if (![view isKindOfClass:UILabel.class]) continue; 
        float w = view.frame.size.width, h = view.frame.size.height; 
        bool fitsInRow = x + w <= width; 
        if (!fitsInRow) {x = 0; y += rowHeight; rowHeight = h;} 
        view.frame = CGRectMake(x, y, w, h); 
        x += w; 
        rowHeight = MAX(rowHeight, h); 
    } 
    // if container is a UIScrollView, change content size 
    container.contentSize = CGSizeMake(width, y + rowHeight); 
    
Các vấn đề liên quan