簡體   English   中英

UITableViewCell frame.size.width對於ipad和iphone是一樣的嗎?

[英]UITableViewCell frame.size.width is the same for ipad and iphone?

嘗試將包含日期的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

您需要設置標簽的autoresizingMask。 根據單元格的初始大小將標簽放在正確的位置,無論它是什么。 正確設置autoresizingMask后,標簽將隨着單元格大小的變化而調整。

在將標簽添加到內容視圖之前,添加:

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

根據所有發布的代碼進行更新:

在自定義單元格中,每次調用setDataLabelWithDate:方法時都會創建並添加標簽。

您可以從updateCellForVideo:調用此方法updateCellForVideo:並且可能從您的視圖控制器調用此方法(您不顯示該代碼)。

您需要更新代碼,這樣每次調用setDataLabelWithDate:時都不會向單元格添加新標簽。 只添加標簽一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM