2013-06-17 36 views
12

Tôi đang cố gắng triển khai lớp con UITableViewCell bị ràng buộc và mọi thứ hoạt động hoàn hảo, ngoại trừ UILabel. Các ràng buộc mà tôi đã thiết lập chắc chắn đang được thực thi, nhưng văn bản bên trong của nhãn không thay đổi kích thước thành cỡ chữ nhỏ hơn khi các xung đột bị ràng buộc. Thay vào đó, chiều cao của UILabel bị cắt ngắn và phông chữ vẫn giữ nguyên kích thước, nghĩa là các chữ cái bị cắt ở đầu và cuối.Văn bản nhãn không được tự động thay đổi kích thước bằng cách sử dụng Bố cục tự động

Có phương pháp nào tôi phải gọi để làm việc này không? Tôi nghĩ Auto Layout sẽ đủ thông minh để tự động thay đổi kích thước phông chữ, vì vậy tôi bị lạc mất vì sao điều này xảy ra.

Mã liên quan:

self.label = [[UILabel alloc] initWithFrame:CGRectZero]; 
self.label.textColor = [UIColor whiteColor]; 
self.label.translatesAutoresizingMaskIntoConstraints = NO; 
self.label.textAlignment = NSTextAlignmentCenter; 
self.label.numberOfLines = 1; 
[self.contentView addSubview:self.label]; 

NSLayoutConstraint *otherViewToLabelHorizontalConstraint = // Make sure that the label is always to the right of the other view. 
        [NSLayoutConstraint constraintWithItem:self.label 
               attribute:NSLayoutAttributeLeft 
               relatedBy:NSLayoutRelationGreaterThanOrEqual 
                toItem:self.otherView 
               attribute:NSLayoutAttributeRight 
               multiplier:1.0 
                constant:0.0]; 

NSLayoutConstraint *aTextFieldToLabelVerticalConstraint = 
        [NSLayoutConstraint constraintWithItem:self.label 
               attribute:NSLayoutAttributeTop 
               relatedBy:NSLayoutRelationGreaterThanOrEqual 
                toItem:self.aTextField 
               attribute:NSLayoutAttributeBottom 
               multiplier:1.0 
                constant:0.0]; 

Về cơ bản, những khó khăn này có nghĩa là để thực thi một tế bào nơi otherView nằm bên tay trái, aTextField là trên bên phải của otherView tại y cùng cấp, và nhãn ở bên dưới aTextField và ở bên phải của phần dưới cùng của otherView.

Như thường lệ, cảm ơn bạn đã giúp đỡ về điều này.

+0

Bạn có nhận được ngoại lệ hoặc một số thông điệp nhật ký khác trong bảng điều khiển của mình khi thêm các ràng buộc này không? – larsacus

+0

Không, cuối cùng tôi đã loại bỏ các phần đã sử dụng ràng buộc này. –

Trả lời

7

Bạn cần

myLabel.adjustsFontSizeToFitWidth = YES; 
myLabel.minimumScaleFactor = .5f; 

Sau đó, nhãn kích thước phông chữ sẽ được tự động điều chỉnh.

+2

Cảm ơn bạn đã phản hồi, nhưng sau khi triển khai mã này, mã vẫn bị cắt ở đầu và cuối. Tôi có cỡ chữ là 18.0f. Tôi đã thử nghiệm phông chữ và mức tối thiểu cần để phù hợp là 13.0f, vì vậy tôi không hiểu tại sao nó sẽ không được tự động giảm kích thước xuống cho đến khi đạt đến số nhân 0,5f. –

2

Cùng với cài đặt adjustsFontSizeToFitWidthminimumScaleFactor, bạn cũng cần phải đặt nén nội dung của nhãn để có mức độ ưu tiên thấp. Kiểm tra phần "Nén sức đề kháng và nội dung ôm" của objc.io essay này. Về cơ bản, nếu nhãn của bạn có một nén ưu tiên kháng thấp hơn so với các hạn chế dấu, nhãn nên được thay đổi kích cỡ:

[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow 
           forAxis:UILayoutConstraintAxisHorizontal]; 
+0

Nếu nhãn bị cắt xén, bạn muốn độ bền nén cao, không thấp. Phải không? – smileBot

2

tôi giải quyết vấn đề này bằng cách thiết lập một chế độ rộng cần thiết để quan điểm tôi đã liên kết nhãn để.

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width]; 

Và đảm bảo mức độ ưu tiên cho ràng buộc này được đặt thành UILayoutPriorityRequired.

[constraint setPriority:UILayoutPriorityRequired]; 

chữ đã được thay đổi kích thước khi ghim nhãn với SuperView nhưng chưa đến textfield, vì vậy tôi suy luận thì phải có một vấn đề với kích thước nội tại của các yếu tố liên quan đến việc tính toán bố trí cho chiều rộng chính thức của nhãn.

+1

'size' trong' constant: size' là gì? – jowie

+0

Đó là chiều rộng của chế độ xem thực tế bạn muốn hạn chế. Tôi đã thay đổi nó thành chiều rộng, như nó phải được. Cảm ơn bạn đã thông báo lỗi – ale0xB

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