2010-06-06 20 views
37

Tôi mới sử dụng iPhone và hiện tôi đang làm việc trên một ứng dụng đọc RSS đơn giản. Vấn đề tôi đang gặp phải là tôi cần đặt lại vị trí textLabel bên trong UITableViewCells. Tôi đã thử setFrame hoặc setCenter nhưng nó không làm gì cả. Có ai biết tôi cần làm gì bên trong phương pháp tableView:cellForRowAtIndexPath: để đặt lại vị trí textLabel ở đầu ô (x = 0, y = 0) không?iPhone UITableViewCell: định vị lại textLabel

Cảm ơn bạn

PS: Các UITableViewCell được tham chiếu bởi một biến gọi là cell. Tôi đã thử [cell setFrame:CGRectMake(0, 0, 320, 20)] mà không thành công.

Trả lời

97

Bạn có thể tạo một lớp con cho UITableViewCell và tùy chỉnh khung văn bản. Xem câu trả lời đó: Labels aligning in UITableViewCell. Nó hoạt động hoàn hảo với tôi.

Đó là lớp con của tôi

#import "UITableViewCellFixed.h" 
@implementation UITableViewCellFixed 
- (void) layoutSubviews { 
    [super layoutSubviews]; 
    self.textLabel.frame = CGRectMake(0, 0, 320, 20); 
} 
@end 

Đó là UITableViewControllerClass tôi:

UITableViewCellFixed *cell = (UITableViewCellFixed *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCellFixed alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
+0

Điều này hoạt động hoàn toàn tuyệt vời :) – Domness

+0

Bạn thực sự cần thiết lập khung nhãn thành 'self.contentView.bounds' –

10

Dường như tôi đã giải quyết được sự cố của riêng mình. Dưới đây là một số mã, trong trường hợp ai đó chạy vào cùng một vấn đề:

UILabel *ttitle = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)] autorelease]; 
ttitle.font = [UIFont boldSystemFontOfSize:13]; 
ttitle.textColor = [UIColor blackColor]; 
ttitle.textAlignment = UITextAlignmentLeft; 

[ttitle setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]]; 

[cell.contentView addSubview:ttitle]; 

Ý tưởng là để tạo ra đối tượng nhãn riêng của bạn, bởi vì textLabel được tự động định vị và không thể di chuyển xung quanh.

Chúc mừng.

+6

này cũng không phá vỡ khi bạn loại bỏ và thêm các tế bào để bàn như UILabel không được loại bỏ đúng cách. – Domness

+0

Một cách để khắc phục sự cố này là gắn thẻ các bản xem trước và xóa chúng sau khi khử đi ô bằng cách lặp qua các bản xem trước. Về cơ bản chúng ta chỉ nên subclassing, việc thêm các subviews trên cellForRowAtIndexPath là lazier, và nguy hiểm hơn bộ nhớ-khôn ngoan – gillyD

9

Lý do mã poster gốc không hoạt động là nó xuất hiện rằng khung của textLabel được thiết lập sau khi UITableViewCell đã được trả về từ phương thức ủy nhiệm của bạn.

Tôi nhận thấy rằng tôi có thể thay đổi thành công nhiều thuộc tính của textLabel, chẳng hạn như căn chỉnh văn bản, màu, phông chữ, vv, nhưng thay đổi khung không có hiệu lực và khi tôi in khung đến trình gỡ lỗi sau (như chọn), khung không phải là thứ tôi đã đặt. Vì vậy, tôi kết luận rằng khung công tác UIKit đang thay đổi khung của textLabel sau khi nó được trả về từ phương thức ủy nhiệm. Không có nghi ngờ điều này có thể được thực hiện bởi vì các kỹ sư của Apple muốn đảm bảo rằng văn bản của bạn đã được rút ra màn hình, vì vậy họ đo nó và thay đổi khung để nó sẽ phù hợp. Họ có thể nghĩ rằng những người như chính chúng ta muốn thay đổi vị trí của văn bản sẽ có thể làm như vậy bằng cách phân lớp, hoặc chỉ cần thêm một UILabel (hoặc bất cứ điều gì) như là một subview. Một nhà phát triển người mới có thể có một thời gian rất khó khăn nếu văn bản của họ không hiển thị trong nhãn hoặc bị cắt bớt bởi vì họ không điều chỉnh khung.

Trong trường hợp của tôi, tôi muốn văn bản nằm ở giữa theo chiều ngang, là màu/phông chữ/kích thước cụ thể và cao hơn một chút theo chiều dọc trong ô. Là quá lười biếng để phân lớp này, lần đầu tiên tôi đã cố gắng thay đổi khung. Khi điều đó không hiệu quả, tôi đã thử googling câu trả lời (tìm thấy bài đăng này).

Giải pháp cuối cùng của tôi là đặt thuộc tính numberOfLines thành 0 và thêm một số dấu xuống dòng sau vào văn bản của tôi. Bây giờ điều đó là lười biếng.

+6

Upvoted do là một bản tóm tắt tốt về vấn đề này. Giải pháp cuối cùng là khủng khiếp mặc dù ;-) –

21

Bạn có thể thử indentationLevel, separatorInset và tính thụt đầu dòng những nội dung khác của đối tượng UITableViewCell.

+0

Phương pháp đơn giản nhất. (y) –

0

Trong Swift 3 nó sẽ là

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.textLabel?.frame.origin.x = 50 
} 
Các vấn đề liên quan