2010-06-01 49 views
7

Làm cách nào để sắp xếp một số UILabels và/hoặc UIButton có độ dài thay đổi? Tôi chỉ muốn thêm chúng vào một UITableViewCell và chúng nên sắp xếp theo một luồng từ trái sang phải, giống như dòng văn bản trong một đoạn văn.Cách sắp xếp nhãn theo cách flowlayout?

Tôi chỉ tìm thấy khả năng tạo lab với kích thước cố định và vị trí bằng cách sử dụng "initWithFrame: ...". Điều tương tự cũng đúng với Interface Builder, theo như tôi có thể nói. Bất kỳ giải pháp nào được đánh giá cao bất kể nó được thực hiện trong mã hay sử dụng một tệp XIB tùy chỉnh của ô.

Trả lời

1

UITableViewCell, UILabel, và UIButton đều lớp con của UIView và tài liệu dành UIView nói:

Layout và subview quản lý

  • Một quan điểm có thể chứa số không hay nhiều subviews.
  • Mỗi chế độ xem xác định hành vi thay đổi kích thước mặc định của chính nó liên quan đến chế độ xem gốc.
  • Chế độ xem có thể thay đổi kích thước và vị trí của các bản xem phụ theo cách thủ công khi cần.

Vì vậy, nó chắc chắn có thể làm được.

Bạn có thể tạo nhãn và nút của bạn sử dụng initWithFrame: với lập luận CGRectZero và sau đó thay đổi kích thước họ (dựa trên văn bản hoặc bất kỳ) sử dụng setBounds: hoặc setFrame: (vì ngay bây giờ bạn chỉ cần đi để thiết lập kích thước của xem) . Sau đó, thêm các chế độ xem này dưới dạng các bản xem trước của ô contentView của ô. Sau đó, trong một lớp con tùy chỉnh của UITableViewCell, bạn có thể thực hiện giải pháp của mình bằng cách ghi đè hành vi mặc định (không có gì) của layoutSubviews: để đặt trường gốc của khung của chế độ xem phụ (nghĩa là CGRect) sẽ định vị các phần phụ trong xem nội dung của ô (kích thước đã được đặt). Bạn có thể cần gọi số setNeedsLayout: hoặc layoutIfNeeded:.

Đây thực sự là một phác thảo sơ bộ về cách có thể triển khai giải pháp vì có rất nhiều chi tiết bị bỏ sót. Ví dụ: nếu bạn thay đổi kích thước nút dựa trên văn bản của titleLabel, có thể bạn sẽ muốn dán một số vào chiều rộng và chiều cao nếu không, nút sẽ có kích thước của nhãn và trông sẽ lạ. Trong phương pháp layoutSubviews:, có thể có một số lượng hợp lý logic để bố trí nhãn và nút theo cách bạn muốn (ví dụ, nó sẽ đơn giản hơn nếu tất cả các bản xem trước của một ô có cùng loại như tất cả các nhãn). nếu các cuộc khảo sát có thể bao trùm đến một dòng mới.

0

Tôi muốn làm điều tương tự để cho phép người dùng nhập thẻ vào trường văn bản - giống như cách bạn nhập địa chỉ email, địa chỉ được chuyển đổi thành thẻ màu xanh (tên người dùng khi đó địa chỉ email của người dùng đã có trong danh sách liên hệ của bạn). Chưa viết nó, nhưng sẽ rất vui khi được chia sẻ với bạn khi tôi làm vậy. Tôi không thể cam kết sẽ mất bao lâu để viết điều này thật không may. Tuy nhiên nếu không có ai khác có mã họ có thể chia sẻ và bạn cần hoàn thành công việc nhanh chóng - Chỉ cần làm một mẹo, hãy xem xét việc này:

Tạo thẻ xem đối tượng trong đó mỗi đối tượng biết kích thước của vùng văn bản gốc/thẻ chứa xem và nơi mỗi đối tượng thẻ có một phương thức tiện ích mà một đối tượng thẻ khác có thể sử dụng để chèn chính nó vào đúng vị trí. Cách tiếp cận này giúp dễ dàng quản lý các thẻ xem và chuyển tiếp bằng cách sử dụng luồng lặp đơn giản.

+0

Xin chào, bạn có thể muốn hỏi câu hỏi này như một câu hỏi mới, bởi vì đó không phải là câu trả lời hay cho câu hỏi của tôi. Tuy nhiên, bây giờ tôi đã tắt chủ đề đó và sẽ xem xét vấn đề này nếu tôi quay lại dự án đó ... –

0

Hi Nếu bạn vẫn cần câu trả lời ... Để nhận được kích cỡ văn bản (và sau đó tính khung của UILabel/UIButton, v.v.), hãy sử dụng hàm sizeWithFont: NSString, cung cấp cho bạn chiều rộng/chiều cao của một chuỗi văn bản sử dụng phông chữ được chỉ định.

Có một chút toán học mà bạn sẽ cần phải làm để làm việc tốt nhất, nơi đặt UILabels và khoảng trắng, nhưng bạn sẽ có dữ liệu mà bạn cần làm.

Hy vọng điều này sẽ hữu ích!

1

Đối với UILabels nhiều dòng để có chiều rộng và chiều cao, bạn nên sử dụng phương pháp NSString sizeWithFont: constrainedToSize: lineBreakMode: sau đó bạn có thể sử dụng các kích thước bạn có thể để đặt mọi thứ ra ở vị trí cần thiết.

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