如何根据 cellForRowAtIndexPath 中的设备获取单元格宽度。我使用自动布局和 UITableViewAutomaticDimension

Posted

技术标签:

【中文标题】如何根据 cellForRowAtIndexPath 中的设备获取单元格宽度。我使用自动布局和 UITableViewAutomaticDimension【英文标题】:How to get Cell Width according to device wise in cellForRowAtIndexPath. I use Autolayout and UITableViewAutomaticDimension 【发布时间】:2018-08-10 12:46:12 【问题描述】:

我的自定义单元格和storyboard 设计在iPhone8Label 宽度为355,但是当我在iPhone5 中运行项目时,我希望根据iPhone5 的宽度为300,但是当我NSLog 标签宽度仍然我得到355。 我如何在iPhone5 中获得Label Width 300?

请大家告诉我如何根据设备获得Label 的宽度

这里是我的代码链接

https://drive.google.com/open?id=1Z2bHhKS_s6P6uICqssaW0gNTDGM-p9vL

请帮帮我

【问题讨论】:

使用UIScreen.main.bounds.width作为单元格宽度,而不是硬编码宽度。 您正在使用单元格,其实际返回的单元格大小来自 xib。 您也可以尝试在 viewDidLoad 中注册单元格,如果您将其注册为 tableView,然后在 cellForRowAtIndex 中重用,则会为您提供所需的行为。 @AbuUlHassan 我怎样才能做到这一点,请详细说明。我想你得到了我真正的问题 在下面查看我的答案并进行修改。 :) 【参考方案1】:
    - (void)viewDidLoad
    
        [super viewDidLoad];
        [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell_iPhone"
                             bundle:[NSBundle mainBundle]]
             forCellReuseIdentifier:@"CustomCell"];
    


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"CustomCell";
    CustomCell_iPhone *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    return cell;


【讨论】:

我的应用程序崩溃并给出以下错误原因:'为标识符 (CustomCell) 注册的 nib 无效 - nib 必须包含一个必须是 UITableViewCell 实例的***对象' 找到你的笔尖并检查重用标识符字段中的属性检查器设置 CustomCell。 我在哪里获得重用标识符?对不起,我不明白 @AnkurPatel 我在回答中澄清了崩溃的原因 选择 nib 后,您将在左窗格中看到视图层次结构,单击您的 tableViewCell 然后您将在右窗格中看到它。【参考方案2】:

cellForRowAt 中打印单元格/子视图框架会给出不正确的值,因为单元格尚未铺设,您的单元格显示正确,但您必须注册单元格而不是此行

cell = [[[NSBundle mainBundle] loadNibNamed:@"CustomCell_iPhone" owner:self options:nil] objectAtIndex:0];

我在下面看到了正确的行并且你评论了它,如果你想显示正确的帧打印它们在自定义单元类的layoutSubviews 方法中,xib 应该只包含一个根单元,所以你必须删除一个在这些单元格中,如果您想将两者都用于 tableView ,则为每个单元格创建单独的 xib

//

-(void) layoutSubviews 
   [super layoutSubviews];
   // NSLog here 

//

由于您的 tableView 占据了屏幕的整个宽度,并且您将单元格边距从两侧设置为 10,那么您可以使用它来获取 cellForRowAt 内的 lbl 宽度

CGFloat wid = [[UIScreen mainScreen] bounds].size.width - 20

【讨论】:

是的,您可以删除第二个单元格。我在 CustomCell.m 中使用 layoutSubviews 但我无法根据设备获取框架 不,它给出了正确的值,你的文件也不包含它 我在 CustomCell.M 文件中写了 layoutSubviews 吗?我在 UIViewControler 中的 UItableView 在 CustomCell.M 中 -(void)layoutSubviews [super layoutSubviews]; NSLog(@"lblTemp frame3 : %@",NSStringFromCGRect(self.lblTemp.frame)); 在 Customcell 2018-08-10 18:51:14.895155+0530 demoCell[11042:6883850] lblTemp frame3 中:10, 10, 355, 80 我想要 cellForRowAtIndexPath 中的实际宽度,因为我必须进行一些计算.从 cellForRowAtIndexPath 中返回单元格后调用 layoutSubviews 方法

以上是关于如何根据 cellForRowAtIndexPath 中的设备获取单元格宽度。我使用自动布局和 UITableViewAutomaticDimension的主要内容,如果未能解决你的问题,请参考以下文章

Swift:以编程方式重新排序表行

UITableView didSelectRowAtIndexPath 从未调用

禁用所有 UITableViewCells 用户交互

Swift tableview 单元格单选按钮实现

表格视图延迟(即使在删除手势识别器后)

UITableView 可重用的自定义单元格在子视图中显示错误的内容