0

尝试UILabel在单元格的右下角放置一个包含日期的单元格,无论它是在 iPhone 还是 iPad 上。

这是我目前拥有的,我需要做什么才能获得实际的 cell size.width,我也尝试过这样做cell.bounds.size.width,无论是 iPhone 还是 iPad,都具有相同的价值:

float xValue = cell.frame.size.width - 100;
UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(xValue, 20.0f, 100, 17.0f)];
[nameLabel setTag:1];
[nameLabel setFont:[UIFont boldSystemFontOfSize:15.0]];
nameLabel.textColor = [UIColor grayColor];
nameLabel.text = @"05-12-13";
// custom views should be added as subviews of the cell's contentView:
[cell.contentView addSubview:nameLabel];

ETA,这是整个自定义单元格类,也许有人可以看到导致标签重复的原因:

@interface VideoTableViewCell : UITableViewCell

+ (VideoTableViewCell *)cellForTableView:(UITableView *)tableView;
+ (CGFloat)heightForVideo:(id<VideoProtocol>)video;
- (void)updateCellForVideo:(id<VideoProtocol>)video;

@end

#define MARGIN 10

@implementation VideoTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        self.textLabel.font  = [UIFont boldSystemFontOfSize:14];

        self.detailTextLabel.font = [UIFont systemFontOfSize:13];
        self.textLabel.numberOfLines = 2;
        self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    return self;
}

+ (VideoTableViewCell *)cellForTableView:(UITableView *)tableView {

    NSString *identifier = @"TweetCell";
    VideoTableViewCell *cell = (VideoTableViewCell *)[tableView
                                                    dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[VideoTableViewCell alloc]
                initWithStyle:UITableViewCellStyleSubtitle
                reuseIdentifier:identifier];
    }

    return cell;
}

- (void)layoutSubviews {

    [super layoutSubviews];
    CGRect cvf = self.contentView.frame;
    self.imageView.frame = CGRectMake(0.0,
                                      0.0,
                                      cvf.size.height-1,
                                      cvf.size.height-1);
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;

    CGRect frame = CGRectMake(cvf.size.height + MARGIN,
                              self.textLabel.frame.origin.y,
                              cvf.size.width - cvf.size.height - 2*MARGIN,
                              self.textLabel.frame.size.height);
    self.textLabel.frame = frame;

    frame = CGRectMake(cvf.size.height + MARGIN,
                       self.detailTextLabel.frame.origin.y,
                       cvf.size.width - cvf.size.height - 2*MARGIN,
                       self.detailTextLabel.frame.size.height);
    self.detailTextLabel.frame = frame;
}

- (void)setDateLabelWithDate:(NSDate *)date {


    float xValue = self.frame.size.width - 70;
    // create a custom label:                                        x       y   width  height
    UILabel *dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(xValue, 40.0f, 100, 12.0f)];
    dateLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin;
    [dateLabel setFont:[UIFont boldSystemFontOfSize:13.0]];
    dateLabel.textColor = [UIColor grayColor];

    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM-dd-yy"];
    NSString *dateString = [dateFormatter stringFromDate:date];
    dateLabel.text = dateString;
    [self.contentView addSubview:dateLabel];
}

+ (CGFloat)heightForVideo:(id<VideoProtocol>)video {

    //create a dummy cell
    VideoTableViewCell *sampleCell  = [[VideoTableViewCell alloc]
                                         initWithStyle:UITableViewCellStyleSubtitle
                                         reuseIdentifier:nil];
    [sampleCell updateCellForVideo:video];

    //calculate the sizes of the text labels
    CGSize textSize = [video.title sizeWithFont: [VideoTableViewCell textLabelFont]
                                  constrainedToSize:sampleCell.textLabel.frame.size
                                      lineBreakMode:UILineBreakModeWordWrap];
    CGFloat minHeight = 51 + 10;  //image height + margin
    return MAX(textSize.height + 20, minHeight);    
}

+ (UIFont *)textLabelFont {
    return [UIFont systemFontOfSize:13];
}

- (void)updateCellForVideo:(id<VideoProtocol>)video {

    // set the text to the date with the tweet text
    self.textLabel.text = video.title;
    id<VideoAttrProtocol> speaker = [[video.speakers allObjects] objectAtIndex:0];
    self.detailTextLabel.text = speaker.name;
    [self setDateLabelWithDate:video.post_date];
    NSURL *url = [NSURL URLWithString:video.thumbnail];    
    [self.imageView setImageWithURL:url
                   placeholderImage:[UIImage imageNamed:@"Logo.png"]];
}


@end
4

1 回答 1

2

您需要设置标签的 autoresizingMask。根据单元格的初始大小将标签放在正确的位置,无论它是什么。正确设置 autoresizingMask 后,标签将随着单元格大小的变化而调整。

在将标签添加到内容视图之前,添加:

// Keep the label in the bottom-right corner
nameLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;

根据所有发布的代码进行更新:

在您的自定义单元格中,您每次setDataLabelWithDate:调用该方法时都会创建并添加一个标签。

您可以从您的视图控制器(也可能从您的视图控制器)调用此方法updateCellForVideo:(您不显示该代码)。

您需要更新您的代码,以免每次setDataLabelWithDate:调用时都向单元格添加新标签。只添加一次标签。

于 2013-04-14T03:47:25.437 回答