新浪微博客户端(23)-计算Cell内控件的frame

DJStatusCellFrame.m

#import "DJStatusCellFrame.h"
#import "DJStatus.h"
#import "DJUser.h"

@implementation DJStatusCellFrame

- (void)setStatus:(DJStatus *)status {

    _status = status;

    DJUser *user = status.user;

    /* 计算控件Frame */
    CGFloat cellW = [UIScreen mainScreen].bounds.size.width;

    // 头像
    CGFloat iconW = 45;
    CGFloat iconH = 45;
    CGFloat iconX = DJStatusCellMargin;
    CGFloat iconY = DJStatusCellMargin;
    self.iconViewF = CGRectMake(iconX, iconY, iconW, iconH);

    // 昵称
    CGFloat nameX = CGRectGetMaxX(self.iconViewF) + DJStatusCellMargin;
    CGFloat nameY = iconY + DJStatusCellMargin2;
    CGSize  nameSize = [user.name sizeWithFont:DJStatusCellNameFont];
    self.nameLabelF = (CGRect){{nameX,nameY},nameSize};

    // 会员标志
    if (user.isVip) { // 如果用户是会员,才计算会员图标的frame
        CGFloat vipX = CGRectGetMaxX(self.nameLabelF) + DJStatusCellMargin;
        CGFloat vipY = nameY;
        CGFloat vipW = 16;
        CGFloat vipH = nameSize.height;
        self.vipViewF = CGRectMake(vipX, vipY, vipW, vipH);
    }

    // 时间
    CGFloat timeX = nameX;
    CGFloat timeY = CGRectGetMaxY(self.nameLabelF) + DJStatusCellMargin2;
    CGSize  timeSize = [status.created_at sizeWithFont:DJStatusCellTimeFont];
    self.timeLabelF = (CGRect){{timeX,timeY},timeSize};

    // 来源
    CGFloat sourceX = CGRectGetMaxX(self.timeLabelF) + DJStatusCellMargin;
    CGFloat sourceY = timeY;
    CGSize sourceSize = [status.source sizeWithFont:DJStatusCellSourceFont];
    self.sourceLabelF = (CGRect){{sourceX,sourceY},sourceSize};

    // 内容
    CGFloat contentX = iconX;
    CGFloat contentY = MAX(CGRectGetMaxY(self.iconViewF), CGRectGetMaxY(self.timeLabelF)) + DJStatusCellMargin;
    CGFloat cellMaxW = cellW - 2 * DJStatusCellMargin;
    CGSize  contentSize = [status.text sizeWithFont:DJStatusCellContentFont maxW:cellMaxW];
    self.contentLabelF = (CGRect){{contentX,contentY},contentSize};

    // 原创微博整体
    CGFloat originalX = 0;
    CGFloat originalY = 0;
    CGFloat originalW = cellW;
    CGFloat originalH = CGRectGetMaxY(self.contentLabelF) + DJStatusCellMargin;
    self.originalViewF = CGRectMake(originalX, originalY, originalW, originalH);

    self.cellHeight = originalH;

}

@end

DJStatusCell.m

#import "DJStatusCell.h"
#import "DJStatusCellFrame.h"
#import "DJStatus.h"
#import "DJUser.h"
#import "UIImageView+WebCache.h"

@interface DJStatusCell()

//============================== 原创微博部分 ========================================

/** 原创微博整体 */
@property (nonatomic,weak) UIView *originalView;
/** 头像 */
@property (nonatomic,weak) UIImageView *iconView;
/** 会员标志 */
@property (nonatomic,weak) UIImageView *vipView;
/** 微博图片 */
@property (nonatomic,weak) UIImageView *photoView;
/** 昵称 */
@property (nonatomic,weak) UILabel *nameLabel;
/** 发布时间 */
@property (nonatomic,weak) UILabel *timeLabel;
/** 微博来源 */
@property (nonatomic,weak) UILabel *sourceLabel;
/** 微博内容 */
@property (nonatomic,weak) UILabel *contentLabel;

//============================== 原创微博部分 ========================================

@end

@implementation DJStatusCell

+ (instancetype)cellWithTableView:(UITableView *)tableView {

    static NSString *ID = @"status";

    DJStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (!cell) {
        cell = [[DJStatusCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    return cell;
}

/** cell的默认初始化方法,此方法只会被调用一次 */
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        // 原创微博整体
        UIView *originalView = [[UIView alloc] init];
        [self.contentView addSubview:originalView];
        self.originalView = originalView;
//        originalView.backgroundColor = DJRandomColor;

        // 头像
        UIImageView *iconView = [[UIImageView alloc] init];
        [self.originalView addSubview:iconView];
        self.iconView = iconView;

        // 昵称
        UILabel *nameLabel = [[UILabel alloc] init];
        [self.originalView addSubview:nameLabel];
        self.nameLabel = nameLabel;
        self.nameLabel.font = DJStatusCellNameFont;
//        self.nameLabel.backgroundColor = DJRandomColor;

        // 会员标志
        UIImageView *vipView = [[UIImageView alloc] init];
        [self.originalView addSubview:vipView];
        self.vipView = vipView;
        self.vipView.contentMode = UIViewContentModeCenter;
//        self.vipView.backgroundColor = DJRandomColor;

        // 发布时间
        UILabel *timeLabel = [[UILabel alloc] init];
        [self.originalView addSubview:timeLabel];
        self.timeLabel = timeLabel;
        timeLabel.font = DJStatusCellTimeFont;

        // 微博来源
        UILabel *sourceLabel = [[UILabel alloc] init];
        [self.originalView addSubview:sourceLabel];
        self.sourceLabel = sourceLabel;
        sourceLabel.font = DJStatusCellSourceFont;

        // 微博内容
        UILabel *contentLabel = [[UILabel alloc] init];
        [self.originalView addSubview:contentLabel];
        self.contentLabel = contentLabel;
        contentLabel.font = DJStatusCellContentFont;
        contentLabel.numberOfLines = 0; // 设置微博内容为多行显示

        // 微博图片
        UIImageView *photoView = [[UIImageView alloc] init];
        [self.originalView addSubview:photoView];
        self.photoView = photoView;

    }
    return self;

}

- (void)setStatusFrame:(DJStatusCellFrame *)statusFrame {

    _statusFrame = statusFrame;

    DJStatus *status = statusFrame.status;
    DJUser *user = status.user;

    /* 设置当前View的Frame */

    // 头像
    self.iconView.frame = statusFrame.iconViewF;
    [self.iconView sd_setImageWithURL:[NSURL URLWithString:user.profile_image_url] placeholderImage:[UIImage imageNamed:@"avatar_default_small"]];

    // 昵称
    self.nameLabel.frame = statusFrame.nameLabelF;
    self.nameLabel.text = user.name;

    // 会员标志
    if (user.isVip) {
        self.vipView.hidden = NO;
        self.vipView.frame = statusFrame.vipViewF;
        NSString *mbrank = [NSString stringWithFormat:@"common_icon_membership_level%d",user.mbrank];
        [self.vipView setImage:[UIImage imageNamed:mbrank]];
        self.nameLabel.textColor = [UIColor orangeColor];
    } else {
        self.vipView.hidden = YES;
        self.nameLabel.textColor = [UIColor blackColor];
    }

    // 发布时间
    self.timeLabel.frame = statusFrame.timeLabelF;
    self.timeLabel.text = status.created_at;

    // 微博来源
    self.sourceLabel.frame = statusFrame.sourceLabelF;
    self.sourceLabel.text = status.source;

    // 微博内容
    self.contentLabel.frame = statusFrame.contentLabelF;
    self.contentLabel.text = status.text;

    // 微博图片
    self.photoView.frame = statusFrame.photoViewF;

    // 原创微博整体
    self.originalView.frame = statusFrame.originalViewF;

}

@end

最终效果:

时间: 2024-10-07 21:05:39

新浪微博客户端(23)-计算Cell内控件的frame的相关文章

UITalbeViewCell--改变cell基本控件的frame的方法

和你意料的一样, 只需重写layoutSubviews 1 - (void)layoutSubviews 2 { 3 [super layoutSubviews]; 4 5 // 3个基本控件都往左移动10 6 7 CGRect textLabelF = self.textLabel.frame; 8 textLabelF.origin.x -= 10; 9 self.textLabel.frame = textLabelF; 10 11 CGRect detailTextLabelF = se

WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享

WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享 在WinForm程序中,我们有时需要对某容器内的所有控件做批量操作.如批量判断是否允许为空?批量设置为只读.批量设置为可用或不可用等常用操作,本文分享这几种方法,起抛砖引玉的作用,欢迎讨论! 1.  清除容器控件内里面指定控件的值的方法 /// <summary> /// 清除容器里面指定控件的值(通过控件的AccessibleName属性设置为"EmptyValue") /// </

【安卓】给gallery内&quot;控件&quot;挂载事件,滑动后抬起手指时也触发事件(滑动时不应触发)的解决、!

思路: 1.gallery内控件挂载事件(如:onClickListener)的方法类似listview,可直接在baseAdapter.getView内给控件挂载(具体方法百度). 2.貌似没问题,但滑动后(手指在挂载了事件的控件上)抬起手指时仍会触发事件,这是不对的. 解决方法时,若为滑动(x有偏移),则在gallery.onInterceptTouchEvent中拦截事件,子控件自然接受不到事件. 注:1>不能简单的判断x有偏移就拦截,有些设备犯贱,即使原地抬起也有可能有偏移,此时本应触发

iOS开发UI篇—手写控件,frame,center和bounds属性

iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:se

IOS开发基础篇--手写控件,frame,center和bounds属性

iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:se

OS开发UI基础—手写控件,frame,center和bounds属性

OS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:sel

在layoutsubviews中设置子控件的frame,保证执行alpha和frame动画流畅度

在viewDidLoad中初始化需要的子控件,然后提供改变这些子控件的开放接口,然后使用一个bool变量来保存是否已经设置了子类控件的frame类似 -(void)layoutSubviews { [super layoutSubviews]; #pragma mark 这个变量很重要,如果没有就会导致重复的设置frame导致动画效果很差 if (!_laidOut) { _homeNavigationView.frame = self.bounds; _leftNavigationView.f

客户端用JavaScript填充DropDownList控件 服务器端读不到值

填充没有任何问题,但是在服务器端却取不出来下拉表中的内容.页面代码如下. <form id="form1" runat="server"> <div> <h3>看看用js填充的dropdownlist控件在服务器端能读出来吗?</h3> 三个级联下拉列表框: <asp:DropDownList runat="server" id="bigTypeList" Width=&q

GridView模板内控件值的获取

如何获得中EmptyDataTemplate的控件的值 ((TextBox)((Table)GridView1.Controls[0]).Rows[0].FindControl("BankCard")).Text;((DropDownList)((Table)GridView1.Controls[0]).Rows[0].FindControl("DropDownList8")).SelectedItem.Text;如何获得GridView中的FooterTempla