首页 > 其他分享 >IOS-开发获取tableview中cell的最终渲染宽度

IOS-开发获取tableview中cell的最终渲染宽度

时间:2023-09-06 09:47:29浏览次数:49  
标签:layoutSubviews msgview tableview self IOS bounds cell time

如图

 我想要实现一个cell,里面有一个白色的消息区域宽度是整个cell的宽度减少20pt,

 于是我写了

  _msgview.frame =CGRectMake(10, _time.bounds.origin.x+30, self.contentView.bounds.size.width-20, 80);

贴上完整代码
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier {
    self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
    self.selectionStyle = UITableViewCellSelectionStyleNone;//设置无点击样式
    self.backgroundColor =[UIColor colorWithRed:240/255.0 green:239/255.0 blue:244/255.0 alpha:1.0];
  
    _time =[[UILabel alloc] init];
    _time.textAlignment=NSTextAlignmentCenter;
    _time.text=@"";
    _time.font = [UIFont systemFontOfSize:11];
    _time.textColor = [UIColor colorWithRed:146/255.0 green:146/255.0 blue:146/255.0 alpha:1.0];
    _time.frame = CGRectMake(10, 5, self.contentView.bounds.size.width-20, 15);
    [self.contentView addSubview:_time];
    
    _msgview = [[UIView alloc] init];
    _msgview.frame =CGRectMake(10, _time.bounds.origin.x+30, self.contentView.bounds.size.width-20, 80);
    _msgview.backgroundColor=[UIColor whiteColor];
    _msgview.layer.cornerRadius = 8;
    [self.contentView addSubview:_msgview];
    
    _tit = [[UILabel alloc] init];
    _tit.frame = CGRectMake(10, 15, _msgview.frame.size.width-20, 15);
    _tit.text = @"";
    _tit.font =[UIFont systemFontOfSize:13];
    [_msgview addSubview:_tit];
    
    _msg = [[UILabel alloc] init];
  
    _msg.font=[UIFont systemFontOfSize:11];
    _msg.textColor = [UIColor colorWithRed:146/255.0 green:146/255.0 blue:146/255.0 alpha:1.0];
    _msg.numberOfLines = 0;
    [_msgview addSubview:_msg];
    return  self;
}

  这样写的效果

 很明显此时的

self.contentView.bounds.size.width 不是最终的cell的宽度,应该是初始化时候的宽度。


那么如何获取最终的cell宽度呢。

需要知道一个方法layoutSubviews。
在iOS中,UIView的layoutSubviews方法会在以下情况被触发调用:
1. 初始化时
当UIView初始化完成后,会立即调用layoutSubviews方法。
2. 布局发生改变时
如果改变了UIView的边界或子视图的排布,会调用layoutSubviews方法。例如添加/删除子视图,改变bounds,设置autoresizingMask等。
3. 调用setNeedsLayout或layoutIfNeeded时
调用view.setNeedsLayout()会标记需要重新布局,之后合适时机会调用layoutSubviews。
调用view.layoutIfNeeded()会立即触发layoutSubviews。
4. 旋转屏幕时
当界面旋转时,也会触发布局变化,调用layoutSubviews。
5. 视图显示到窗口时
当一个视图将要显示到窗口上时,例如控制器的viewDidAppear,会调用layoutSubviews进行布局。
6. 滚动视图滚动结束时
例如UIScrollView滚动结束会调用layoutSubviews。

可以知道当页面重新布局时会触发layoutSubviews方法,所以我们在自定义的cell类中重写它的layoutSubviews方法。
- (void)layoutSubviews {
    //如果写样式要用到self的长宽高需要在layoutSubviews方法里获取到self的最新宽高
  [super layoutSubviews];

    _msgview.frame =CGRectMake(10, _time.bounds.origin.x+30, self.contentView.bounds.size.width-20, 80);

}

  在这个方法里面 self.contentView.bounds.size.width 可以获取到视图更新后的 cell宽度。此时用它来给_msgview设置frame即可。

  最终实现了我们想要的效果

  

 

总结:如果自定义cell时,某个元素要用到cell本身的宽高来确定元素的frame时,需要在cell的layoutSubviews方法里获取到cell的最新宽高。





 

标签:layoutSubviews,msgview,tableview,self,IOS,bounds,cell,time
From: https://www.cnblogs.com/SadicZhou/p/17681416.html

相关文章

  • <br /> <font size= 1 ><table class= xdebug-error xe-notice dir= ltr border= 1
    PHP传给前端的值有大量html代码错误1:html代码中,发送请求,多加了引号 ......
  • axios封装后发get请求
    ruoyi的前端对axios进行了封装,让我们发get请求或者是post请求更加方便了。ruoyi对axios的封装在下面文件中:打开文件,可以看到它有三个显眼的方法,分别是request拦截器、response拦截器和通用下载方法。request拦截器对我们发送的请求进行了封装,当我们发送Get请求,那么我们携带参数......
  • iOS - Info.plist 隐私权限配置
    封装了常用的隐私权限判断(定位服务,通讯录,日历,提醒事项,照片,蓝牙,麦克风,语音识别,相机,健康,媒体与AppleMusic)和通知的注册和判断。权限介绍隐私数据对应key值提示语使用期间访问位置Privacy-LocationWhenInUseUsageDescriptionAPP需要您的同意,才......
  • iOS代码加固与保护方法详解 - 提升iOS应用安全性的关键步骤
    摘要:作为一名从事iOS开发多年的技术博主,长期以来我都没有重视代码加密和加固。然而,最近了解到使用IPAGuard工具可以对iOS应用进行混淆保护,我开始重新审视iOS应用的安全性问题。本文将详细介绍如何使用IPAGuard工具进行代码加固和保护,以提高iOS应用的安全性和抵御逆向分析的风险。......
  • iOS代码加固与保护方法详解 - 提升iOS应用安全性的关键步骤
    摘要:作为一名从事iOS开发多年的技术博主,长期以来我都没有重视代码加密和加固。然而,最近了解到使用IPAGuard工具可以对iOS应用进行混淆保护,我开始重新审视iOS应用的安全性问题。本文将详细介绍如何使用IPAGuard工具进行代码加固和保护,以提高iOS应用的安全性和抵御逆向分析的风险......
  • 直播带货源码,iOS 获取图片主题色
    直播带货源码,iOS获取图片主题色 -(void)getMostColorFormImage:(UIImage*)image{  WEAKSELF  [imagegetPaletteImageColorWithMode:ALL_MODE_PALETTEwithCallBack:^(PaletteColorModel*recommendColor,NSDictionary*allModeColorDic,NSError*error){   ......
  • vue3+ts Axios封装—重复请求拦截
    创建好vue3项目1.安装Axios与ElementPlusAxios安装npminstallaxiosElementPlus安装官网入口:https://element-plus.gitee.io/zh-CN/npminstallelement-plus--saveElement主要用到信息提示与全屏加载动画2.在src目录下创建api文件夹和utils文件夹api......
  • IOS隐私政策
     iOS隐私政策本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息。但本应用将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本应用不会将......
  • iOS接入IJKPlayer遇到的问题汇总
    1、播放编码mpeg视频有声音无画面exportCOMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS--enable-decoder=mpegvideo"2、播放编码mpeg-4+AAC视频有声音无画面exportCOMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS--enable-decoder=mpeg4"参考链接:1、iOS制作ijkplayer静态库......
  • 深入了解Axios:现代化的HTTP请求库
    简介:Axios是一个基于Promise的现代化HTTP请求库,它在前端开发中被广泛使用。本文将深入探讨Axios的特性、用法以及为什么它成为开发者的首选。一、什么是Axios?Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js环境中发送HTTP请求。它是一个简洁、直观且功能强大的库,提供了......