2009-08-20 38 views
20

Tôi đang sử dụng UITableViewCell với UITableViewCellStyleSubtitle. Tuy nhiên, vì hình nền tôi đang sử dụng cho ô, tôi không thích vị trí của detailTextLabel. Tôi muốn di chuyển nó và thay đổi kích thước nó trong tế bào, nhưng không có gì tôi cố gắng dường như làm việc.Điều chỉnh vị trí của nhãn trong UITableViewCell

CGRect currRect = cell.detailTextLabel.frame; 
cell.detailTextLabel.frame = CGRectMake(currRect.origin.x + 20, currRect.origin.y, currRect.size.width - 40, currRect.size.height); 

Tôi đã thử đặt mã này vào cả hai tableView: cellForRowAtIndexPath và tableView: phương pháp forRowAtIndexPath, nhưng không phải công trình: willDisplayCell. Nhãn chỉ đơn giản là ở vị trí của nó và cùng kích thước.

Điều chỉnh các thuộc tính khác của nhãn (textAlignment, backgroundColor và, tất nhiên, chính văn bản) hoạt động chính xác.

Làm thế nào để tôi có được detailTextLabel để di chuyển đến nơi tôi cần?

Trong trường hợp vấn đề này (mặc dù tôi không thấy lý do tại sao nó nên), ô này cũng có thuộc tính imageView.image và backgroundImage được đặt. Cả hai hình ảnh đều hiển thị chính xác.

Trả lời

34

Bạn sẽ muốn một lớp con tùy chỉnh UITableViewCell ghi đè bố cụcSubviews để thực hiện công việc dơ bẩn khi đặt ra bất kỳ bản xem phụ nào trong đó. Gọi siêu sau đó điều chỉnh detailTextLabel.frame có lẽ là điều dễ nhất để làm.

+0

Cảm ơn bạn. Tôi biết bạn có thể làm điều này rồi, nhưng tôi không biết đó là phương pháp layoutSubviews phải được ghi đè. – executor21

+0

Đây là lời khuyên tuyệt vời. Tuy nhiên, tôi có vấn đề này vẫn còn ở đâu, trong khi tôi có thể tùy chỉnh kích thước nhãn, ví dụ, tôi không thể có được nó để wordwrap và hiển thị nhiều dòng, tức là: \t self.textLabel.numberOfLines = 2; \t self.textLabel.lineBreakMode = UILineBreakModeWordWrap; – Joey

+0

Hành vi của thuộc tính .textLabel phải giống hệt với bất kỳ nhãn UILabel nào khác, vì vậy có lẽ bạn không cung cấp đủ không gian theo chiều dọc? –

1

Hoặc, bạn có thể thay đổi ô từ UITableViewCellStyleSubtitle, thành mặc định và thêm đối tượng của riêng bạn vào ô.contentView và đặt chúng ở nơi bạn muốn. Bạn không nhất thiết phải phân lớp UITableViewCell (ví dụ: ô tùy chỉnh) hoặc sử dụng layoutSubViews. Tất cả có thể được thực hiện trong tableView: cellForRowAtIndexPath.

+0

Đã thử điều này. Nhãn chính sau đó di chuyển vào giữa ô, và nó cũng không thể di chuyển được. Subclassing có vẻ ít rắc rối hơn. – executor21

-3

Bạn có thể làm điều này với số CGAffineTransform. Các (chưa được kiểm tra) Mã để đẩy detailTextLabel đúng 10 pixel sẽ trông gần như thế:

CGAffineTransform translate = CGAffineTransformMakeTranslation(10.0, 0.0); 
[detailTextLabel setTransform:translate]; 

Trong khi bạn có thể làm được điều này, tôi nghĩ bạn sẽ có hạnh phúc hơn tạo tùy chỉnh riêng của bạn UITableViewCell.

+0

Không hoạt động. Rõ ràng, bạn không thể điều chỉnh vị trí của các bản xem trước theo bất kỳ cách nào mà không cần phân lớp con. – executor21

44

Bạn có thể thử và điều chỉnh nhãn với thụt đầu dòng và thụt đầu dòng cấp:

cell.indentationWidth = MY_DESIRED_WIDTH; 
cell.indentationLevel = 1; 

(cho các tế bào bỏ thụt lề)

Hoặc cho tế bào thụt chỉ làm:

cell.indentationLevel = cell.indentationLevel + 1; 

Cả hai nên thay đổi/thụt lề nhãn của bạn.

+1

Điều này làm việc tuyệt vời vì nó có nghĩa là đối với một số bố trí (nơi bạn có một hình ảnh bên trái), bạn không cần phải thêm nhãn của riêng bạn để thay thế nhãn hiện có. Cảm ơn. –

+0

Câu trả lời Grear, tốt để cuối cùng biết một cái gì đó như thế này tồn tại! – pmk

+4

Cần lưu ý rằng 'cell.indentationWidth' có thể là số âm - có nghĩa là bạn không cần phải phân lớp ô nếu bạn chỉ cần chuyển toàn bộ contentView sang trái. – SaltyNuts

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