2013-09-03 28 views
5

Tôi đang tạo chế độ xem iOS hiển thị các phần tử văn bản tĩnh khác nhau. Các xib trông như thế này:Khoảng cách dọc này đến từ đâu trong UILabelView?

enter image description here

Nó sử dụng bốn nhãn cho các tiêu đề, dấu thời gian, thân và chân. Mỗi chế độ xem được neo vào chế độ xem anh chị em ở trên nó theo chiều dọc và được neo sang trái/phải của chế độ xem gốc. Tất cả các nhãn đều có chiều cao cố định ngoại trừ phần thân có chiều cao> = và số dòng được đặt thành 0 bằng "bọc từ" làm kiểu gói dòng. Chế độ xem gốc là một UIScrollView.

Trên iPhone có vẻ như tốt:

iPhone beginning of scroll iPhone end of scroll

Tuy nhiên trên iPad nó trông như thế này:

iPad beginning of scroll iPad end of scroll

Huh? Đâu là tất cả không gian dọc phụ trong nhãn cơ thể đến từ đâu? Các xib và bộ điều khiển xem của nó là giống hệt nhau giữa iPhone và iPad (không có mã iPad tùy chỉnh tại thời điểm này). Tôi đã tìm thấy rằng không gian dọc có liên quan trực tiếp đến bao nhiêu dòng kết thúc tốt đẹp mà nhãn hiển thị. Nếu không có dòng bọc, không có thêm không gian dọc. Nếu chỉ có một vài dòng bọc, có thêm một chút không gian dọc. Nếu gần như tất cả các dòng kết thúc tốt đẹp, tốt, đó là những gì nó trông giống như.

Trước hết mọi ý tưởng về lý do khiến UILabel hoạt động theo cách này?

Thứ hai, nếu tôi không thể dừng việc này, tôi có thể làm việc như thế nào?

Tôi đã thử một vài điều. Nếu tôi gọi [bodyLabel sizeToFit] trong phạm vi -viewDidLayoutSubViews thì nó sẽ sửa nhãn nhưng không sửa bố cục của bất kỳ chế độ xem anh chị em nào (ví dụ: nhãn Chân trang bị kẹt ở cuối màn hình thay vì được kéo lên ngay dưới thân hình). Bất kỳ nỗ lực nào để có được toàn bộ khung nhìn để bố trí lại các con của nó sau khi gọi hàm sizeToFit bị bỏ qua. Tôi cũng đã thử kích thước UILabel bằng cách tính chiều cao dựa trên phông chữ, kết quả trong cùng một hành vi như -sizeToFit (mặc dù có nhiều mã hơn).

Thay thế nhãn UILabel bằng UITextView thay vì không cung cấp cho tôi các vấn đề giãn cách dọc kỳ lạ nhưng tôi cần tính chiều cao của UITextView theo cách thủ công (sử dụng tính toán phông chữ) và điều gì đó về việc thay đổi kích thước UITextView trong UIScrollView cha mẹ. vì vậy UIScrollView đơn giản từ chối di chuyển (như thể nó không biết nội dung của nó quá lớn đối với các giới hạn của nó).

Vì vậy, hiện tại tôi đang bị kẹt. Ngay cả chỉ là một lời giải thích của lý do tại sao UILabel hoạt động theo cách này trên bố cục iPad sẽ rất hữu ích.

+1

Bạn đang sử dụng Autolayout hoặc Springs và Struts? – CoderPug

+0

Tôi đang sử dụng Autolayout. Tôi có thể đăng các ràng buộc nếu bạn muốn. Tôi đã cố gắng giải thích các ràng buộc có liên quan trong đoạn đầu tiên. – Brandon

+1

Hãy nhìn tôi rằng các vấn đề là những ràng buộc, nếu sử dụng '[bodyLabel sizeToFit]' kích hoạt footer bị kẹt ở phía dưới thì bạn cần kiểm tra các ràng buộc của mình, có lẽ một cái để đặt Footer ở phía dưới và những cái khác tạo ra nhãn Cơ thể của bạn để kéo theo chiều dọc. – CoderPug

Trả lời

3

Vấn đề chính là phương pháp tự động thay đổi kích thước văn bản bên trong Nhãn của bạn không thành công vì trong iPad Nhãn của bạn không có chiều rộng được đặt từ đầu, nó được tính trên thời gian chạy và đó là nguồn gốc của mớ hỗn độn đó . Trên iPhone, vì Nhãn của bạn có chiều rộng được đặt (trên IB) không có vấn đề gì.

Có hai cách để giải quyết vấn đề:

  1. Có hai storyboards: một dành cho iPhone và một cho iPad

    Việc làm này sẽ làm cho điều đó Label của bạn biết chiều rộng của nó ngay từ đầu và nó sẽ hoạt động như trên iPhone. enter image description here

  2. Có chỉ là một Storyboard cho cả iPhone và iPad

    Bạn có thể đi xung quanh các vấn đề bằng cách tính toán kích thước thích hợp nhất với văn bản của nó và với kết quả mà thêm một hạn chế chiều cao của mã để các Label . Để tính toán mong muốnSize bạn có thể tính toán chiều rộng với công thức này: Current View's width - (Leading space + Trailing Space). Đây là mã của tôi

CGSize desiredSize = [_bodyLabel sizeThatFits:CGSizeMake(self.view.frame.size.width-40, 10)]; 
NSString *visualContraint = [NSString stringWithFormat:@"V:[_bodyLabel(%.0f)]",desiredSize.height]; 
[_bodyLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:visualContraint 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:NSDictionaryOfVariableBindings(_bodyLabel)]]; 

enter image description here

4

Trong trường hợp bất cứ ai khác chạy vào vấn đề này cùng sử dụng autolayout ... Tôi có thể đã có thể giải quyết cùng một vấn đề bằng cách tạo một hạn chế như Coche gợi ý, nhưng tôi nhận ra rằng tôi đã có một preferredMaxLayoutWidth đã quá nhỏ trên bộ nhãn. Khi tôi đã đặt chính xác preferredMaxLayoutWidth (chiều rộng thực tế của nhãn), khoảng cách ở trên và dưới biến mất.

+0

Đây là câu trả lời * đúng */thích hợp hơn IMHO. Nó yêu cầu không có mã xung quanh (mã UI ít hơn thì tốt hơn khi vào đường dẫn Auto-Layout + IB). Điều này đã khắc phục được sự cố của tôi. – Form

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