2013-07-06 40 views
10

tôi đã cố gắng cho hai ngày để sửa đổi khung của một UILabel, mà là lố bịch ... Các UILabel là một IBOutlet, nhưng đó không phải là lý do tại sao nó không làm việc: Tôi đã cố gắng để tạo ra một UILabel programatically và nó vẫn không hoạt động. Dưới đây là cách tôi làm điều đó:Tại sao tôi không thể thay đổi khung của UILabel?

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = self.descriptionLabel.frame; 
frame.size.height = frameHeight; 
self.descriptionLabel.frame = frame; 

CGRect bounds = self.descriptionLabel.frame; 
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0; 
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0; 
self.descriptionLabel.bounds = bounds; 
self.descriptionLabel.numberOfLines = 0; 

Tôi đã hỏi trên IRC và họ nói với tôi rằng không có lý do tại sao khung sẽ không được thay đổi ...

Tôi cũng đã cố gắng để tạo ra một khung với CGRectMake và cung cấp cho nó tùy ý giá trị nhưng điều đó đã không thực hiện thủ thuật ..

Có ai biết vấn đề này có thể là gì không?

Sửa 1: tôi đăng khung trước và sau, và tôi đã nhận kết quả kỳ lạ:

Before: 0.000000 0.000000 0.000000 0.000000 
After: 0.000000 0.000000 0.000000 33525.000000 

Chiều cao sau khi tôi thiết lập các khung là giá trị duy nhất mà làm cho tinh thần (Tôi có rất nhiều văn bản trong nhãn có mục đích).

Chỉnh sửa 2: Tôi đã thay đổi mã như sau, nhật ký cho biết khung đã thay đổi nhưng trên trình mô phỏng nó không thay đổi; Tôi đã chứng minh điều đó bằng cách thêm đường viền màu đỏ vào lớp của UILabel.

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight); 
self.descriptionLabel.frame = frame; 

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height); 
// After: 0.000000 300.000000 320.000000 585.000000 

self.descriptionLabel.numberOfLines = 0; 
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor; 
self.descriptionLabel.layer.borderWidth = 2; 

Proof

+0

Bạn đã đăng nhập khung trước và sau? Và tại sao bạn thay đổi giới hạn (đặc biệt là bằng cách sử dụng khung, mà là trong một không gian tọa độ khác nhau)? – Wain

+0

Tôi đã đăng nhập khung hình trước và sau khi bạn đề xuất và tôi nhận được kết quả kỳ quặc mà tôi đưa vào câu hỏi mà tôi đã chỉnh sửa. –

+1

Tại sao bạn đặt số dòng 0 ở cuối? – Abizern

Trả lời

26

Nếu bạn đang sử dụng bố cục tự động, bạn không nên thực hiện bất kỳ cài đặt khung nào - tắt bố cục tự động hoặc sử dụng các ràng buộc để thay đổi kích thước nhãn của bạn. Cách dễ nhất để làm điều này là để cho nhãn của bạn một ràng buộc chiều cao (và chiều rộng quá, nếu bạn muốn có chiều rộng không đổi) trong IB, và tạo một IBOutlet cho nó. Sau đó, trong mã, thay đổi giá trị không đổi của ràng buộc đó dựa trên giá trị bạn nhận được từ sizeWithFont: constrainedToSize: lineBreakMode :.

+0

Nó hoạt động !! Cám ơn rất nhiều!! –

+0

Đã làm việc tuyệt vời. Không rõ ràng cách cập nhật ràng buộc. Đây là cách bạn thực hiện: self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

Không chính xác trực quan, nhưng điều này làm việc độc đáo - cảm ơn ông Delmar! – BonanzaDriver

0

nhãn của bạn có một khung zero để bắt đầu với, vì vậy, khi bạn làm điều này:

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 

Bạn đang yêu cầu các phương pháp sizeWithFont để làm điều gì đó một cách hiệu quả là không thể - nói bạn chiều cao được yêu cầu khi không có chiều rộng được cho phép. Phản hồi nó cung cấp (33525.000000) có lẽ là chiều cao nếu một ký tự được phép trên mỗi dòng hoặc một cái gì đó như thế.

Vì vậy, hãy đặt chiều rộng của nhãn trước khi bạn bắt đầu hoặc cung cấp chiều rộng cho phép theo phương pháp sizeWithFont và sau đó đặt kích thước nhãn bằng cách sử dụng phản hồi (không chỉ chiều cao).

Ngoài ra, hãy xem xét những gì bạn đang cố gắng thực hiện bằng cách thay đổi giới hạn. Bình luận rằng mã ra cho đến khi bạn nhận được khung ít nhất, sau đó bạn có thể thêm nó trở lại và kiểm tra xem nó thực sự làm những gì bạn muốn.

+0

Vui lòng xem chỉnh sửa mới nhất của tôi. Tôi theo đề xuất của bạn và trong nhật ký khung thay đổi nhưng nó đã không làm một điều trong giả lập ... –

+0

Và đó là mã duy nhất bạn có mà làm bất cứ điều gì để nhãn? Mã đó ở đâu (phương thức ở đâu và nó được gọi khi nào)? Những quy tắc tự động thay đổi kích thước/bố cục tự động nào? – Wain

+0

Tôi đã thêm UILabel từ IB và tôi không chạm vào các ràng buộc bố cục tự động. Đây là tập tin đầy đủ mà mã này có trong: https://gist.github.com/AzizLight/40b66b2daa2917952d6f Như bạn có thể thấy UILabel được thiết lập trong 'viewDidLoad' và đó là về nó ... –

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