zoukankan      html  css  js  c++  java
  • iOS UI基础08

    • 自定义等高cell
        // 创建自定义cell添加子控件的方法initWithStyle(note:子控件要添加到contentView上)
        - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier NS_AVAILABLE_IOS(3_0);
        // 传统创建自定义view添加子空间的方法
        //- (instancetype)initWithFrame:(CGRect)frame
        // 自定义xib时调用的方法
        //- (void)awakeFromNib;
        //- (instancetype)initWithCoder:(NSCoder *)coder
        // 布局子控件
        - (void)layoutSubviews
       {
          [super layoutSubviews];
       }
       //设置数据
       - (void)setXX:(模型数据类型 *)XX
    
    • Masonry

      • 用Masonry布局子控件frame更简洁易懂,可读性更好。
      • 使用Masonry之前需要导入2个宏和Masonry头文件
       //除掉前缀
        #define MAS_SHORTHAND
       //可接收数据类型参数
        #define MAS_SHORTHAND_GLOBALS
        #import "Masonry.h"
        - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
      {
        if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
      
            // 常用的间距
            CGFloat margin = 10;
      
            CGFloat contentViewW = CGRectGetWidth(self.contentView.frame);
            CGFloat contentViewH = CGRectGetHeight(self.contentView.frame);
      
            // 1.图片
            UIImageView *icon_ImageView = [[UIImageView alloc] init];
            [self.contentView addSubview:icon_ImageView];
            //icon_ImageView.backgroundColor = [UIColor blueColor];
            self.icon_ImageView = icon_ImageView;
      
            [icon_ImageView makeConstraints:^(MASConstraintMaker *make) {
      //            make.left.equalTo(self.contentView.left).offset(margin);
      //            make.top.equalTo(self.contentView.top).offset(margin);
      
                make.top.left.equalTo(self.contentView).offset(margin);
                make.bottom.equalTo(self.contentView.bottom).offset(-margin);
                make.width.equalTo(80);
            }];
      }
      
    • 自定义不等高cell

         // 添加子控件(把有可能显示的子控件都加进去)
         - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
         //布局子空间Frame
         - (void)layoutSubviews
        {
            [super layoutSubviews];
        }
        // 设置子控件显示的数据
        - (void)setXX:(模型数据类型 *)XX
    
        //方案1:在heightForRowAtIndexPath:方法调用之前将所有cell的高度计算清楚
        /**
     *  返回每一行cell的具体高度
     */
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        JXStatus *status = self.statuses[indexPath.row];
    
        CGFloat margin = 10;
        CGFloat cellHeight = 0;
    
        // 头像
        CGFloat iconX = margin;
        CGFloat iconY = margin;
        CGFloat iconWH = 30;
        CGRect iconImageViewFrame = CGRectMake(iconX, iconY, iconWH, iconWH);
    
        // 文字
        CGFloat textX = iconX;
        CGFloat textY = CGRectGetMaxY(iconImageViewFrame) + margin;
        CGFloat textW = [UIScreen mainScreen].bounds.size.width - 2 * textX;
        CGSize textMaxSize = CGSizeMake(textW, MAXFLOAT);
        NSDictionary *textAttrs = @{NSFontAttributeName : [UIFont systemFontOfSize:14]};
        CGFloat textH = [status.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttrs context:nil].size.height;
        CGRect text_labelFrame = CGRectMake(textX, textY, textW, textH);
    
        // 配图
        if (status.picture) {
            CGFloat pictureWH = 100;
            CGFloat pictureX = textX;
            CGFloat pictureY = CGRectGetMaxY(text_labelFrame) + margin;
            CGRect pictureImageViewFrame = CGRectMake(pictureX, pictureY, pictureWH, pictureWH);
    
            cellHeight = CGRectGetMaxY(pictureImageViewFrame);
        } else {
            cellHeight = CGRectGetMaxY(text_labelFrame);
        }
    
        cellHeight += margin;
    
        return cellHeight;
    }
    
    
    
    // 方案2:在模型中计算cell高度,返回高度直接从模型中取出
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        JXStatus *status = self.statuses[indexPath.row];
        return status.cellHeight;
    }
    
    //模型数据
    #import <UIKit/UIKit.h>
    
    @interface JXStatus : NSObject
    /**** 文字图片数据 ****/
    /** 姓名 */
    @property (nonatomic, copy) NSString *name;
    /** 文本 */
    @property (nonatomic, copy) NSString *text;
    /** 头像 */
    @property (nonatomic, copy) NSString *icon;
    /** 配图 */
    @property (nonatomic, copy) NSString *picture;
    /** 是否为会员 */
    @property (nonatomic, assign) BOOL vip;
    
    /**** frame数据 ****/
    /** 头像的frame */
    @property (nonatomic, assign) CGRect iconFrame;
    /** 昵称的frame */
    @property (nonatomic, assign) CGRect nameFrame;
    /** 会员的frame */
    @property (nonatomic, assign) CGRect vipFrame;
    /** 文字的frame */
    @property (nonatomic, assign) CGRect textFrame;
    /** 配图的frame */
    @property (nonatomic, assign) CGRect pictureFrame;
    /** cell的高度 */
    @property (nonatomic, assign) CGFloat cellHeight;
    
    @end
    
    #import "JXStatus.h"
    
    @implementation JXStatus
    - (CGFloat)cellHeight
    {
        if (_cellHeight == 0) {
            CGFloat margin = 10;
    
            // 头像
            CGFloat iconX = margin;
            CGFloat iconY = margin;
            CGFloat iconWH = 30;
            self.iconFrame = CGRectMake(iconX, iconY, iconWH, iconWH);
    
            // 昵称(姓名)
            CGFloat nameY = iconY;
            CGFloat nameX = CGRectGetMaxX(self.iconFrame) + margin;
            // 计算文字所占据的尺寸
            NSDictionary *nameAttrs = @{NSFontAttributeName : [UIFont systemFontOfSize:17]};
            CGSize nameSize = [self.name sizeWithAttributes:nameAttrs];
            self.nameFrame = (CGRect){{nameX, nameY}, nameSize};
    
            // 会员图标
            if (self.vip) {
                CGFloat vipW = 14;
                CGFloat vipH = nameSize.height;
                CGFloat vipY = nameY;
                CGFloat vipX = CGRectGetMaxX(self.nameFrame) + margin;
                self.vipFrame = CGRectMake(vipX, vipY, vipW, vipH);
            }
    
            // 文字
            CGFloat textX = iconX;
            CGFloat textY = CGRectGetMaxY(self.iconFrame) + margin;
            CGFloat textW = [UIScreen mainScreen].bounds.size.width - 2 * textX;
            CGSize textMaxSize = CGSizeMake(textW, MAXFLOAT);
            NSDictionary *textAttrs = @{NSFontAttributeName : [UIFont systemFontOfSize:14]};
            CGFloat textH = [self.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttrs context:nil].size.height;
            self.textFrame = CGRectMake(textX, textY, textW, textH);
    
            // 配图
            if (self.picture) {
                CGFloat pictureWH = 100;
                CGFloat pictureX = textX;
                CGFloat pictureY = CGRectGetMaxY(self.textFrame) + margin;
                self.pictureFrame = CGRectMake(pictureX, pictureY, pictureWH, pictureWH);
    
                _cellHeight = CGRectGetMaxY(self.pictureFrame);
            } else {
                _cellHeight = CGRectGetMaxY(self.textFrame);
            }
            _cellHeight += margin;
        }
        return _cellHeight;
    }
    @end
    
    • 自动布局
      • 在Main.storyboard添加好子控件,设置好约束
      • 设置子控件显示的数据
        • -(void)setXX:(模型数据类型 *)XX
      • 在viewDidLoad中自动计算cell高度
        // 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)
        self.tableView.rowHeight = UITableViewAutomaticDimension;
        // 告诉tableView所有cell的估算高度
        self.tableView.estimatedRowHeight = 44;
  • 相关阅读:
    oracle之sqlplus讲解
    oracle数据库--启动和关闭
    linux下使用SSL代理(SSLedge)
    Titanium系列--利用js动态获取当前时间
    Titanium系列--利用Titanium开发android App实战总结
    Titanium系列--我常用的Titanium的快捷键(持续更新中。。)
    Titanium系列--安装Titanium Studio 中的Android SDK,JDK以及环境变量的配置(二)
    Titanium系列--Titanium的简介、Titanium Studio安装和配置(一)
    Happymenu新的开始
    对IEnumerable<T>和IQueryable<T>的一点见解
  • 原文地址:https://www.cnblogs.com/liujiaoxian/p/4712269.html
Copyright © 2011-2022 走看看