Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableViewCell框架不符合给定的宽度和高度_Ios_Objective C_Uitableview - Fatal编程技术网

Ios UITableViewCell框架不符合给定的宽度和高度

Ios UITableViewCell框架不符合给定的宽度和高度,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我在委托方法中设置UITableViewCell的宽度和高度,但当我在cellForRowAtIndexPath方法中检查单元格框时,结果完全不同。下面是我的代码。我做每件事都是有计划的 self.myTable = [[UITableView alloc] initWithFrame:CGRectMake(self.view.frame.size.width * 0.05,self.view.frame.size.height * 0.08,self.view.frame.size.width

我在委托方法中设置UITableViewCell的宽度和高度,但当我在cellForRowAtIndexPath方法中检查单元格框时,结果完全不同。下面是我的代码。我做每件事都是有计划的

self.myTable = [[UITableView alloc] initWithFrame:CGRectMake(self.view.frame.size.width * 0.05,self.view.frame.size.height * 0.08,self.view.frame.size.width * 0.90,
                                                                      (self.view.frame.size.height * 0.90) - tabBarHeight ) style:UITableViewStylePlain];




- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1.0;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 5;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row == 0 || indexPath.row == 4){
        return self.myTable.frame.size.height * 0.08;
    }
    return (self.myTable.frame.size.height * 0.28);

}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    if(indexPath.row != 4){
        cell.userInteractionEnabled = NO;
    }

    switch (indexPath.row) {
        case 0:{
            NSLog(@"0th cell Frame : %@", NSStringFromCGRect(cell.frame));
            break;
        }
        case 1:{
            NSLog(@"1st cell Frame : %@", NSStringFromCGRect(cell.frame));
            break;

        }

        case 2:{
            NSLog(@"2nd cell Frame : %@", NSStringFromCGRect(cell.frame));
            break;
        }

        case 3:{
            NSLog(@"3rd cell Frame : %@", NSStringFromCGRect(cell.frame));
            break;
        }
        case 4:{

            NSLog(@"4rth cell Frame : %@", NSStringFromCGRect(cell.frame));
            break;
        }
        default:
            break;
    }
    return cell;
}

我得到的单元格帧的输出是{0,0},{320,44}。但是这个细胞结构是不正确的。高度应该是129,宽度应该是288。有人能告诉我我做错了什么吗?

没什么,你的代码没问题。您的单元格将具有所需的大小。问题是您的单元格不知道此方法中的最终大小cellForRowAtIndexPath。他们认为,在这种方法中,它们具有默认大小。但在它们出现之前,它们将被调整大小。如果通过代码定义单元格,则需要使用预期的de-dimension,这是方法heightForCell或estimateHeightForCell的tableView宽度和高度。您可以通过注释这一行并按delegate:来检查这一点,您也可以看到。 要检查的注释行:

  ....
     if(indexPath.row != 4){
  //  cell.userInteractionEnabled = NO;
 }
.....
要检查的工具:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"cell pressed Frame : %@", NSStringFromCGRect(cell.bounds));
}

没什么,你的代码没问题。您的单元格将具有所需的大小。问题是您的单元格不知道此方法中的最终大小cellForRowAtIndexPath。他们认为,在这种方法中,它们具有默认大小。但在它们出现之前,它们将被调整大小。如果通过代码定义单元格,则需要使用预期的de-dimension,这是方法heightForCell或estimateHeightForCell的tableView宽度和高度。您可以通过注释这一行并按delegate:来检查这一点,您也可以看到。 要检查的注释行:

  ....
     if(indexPath.row != 4){
  //  cell.userInteractionEnabled = NO;
 }
.....
要检查的工具:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"cell pressed Frame : %@", NSStringFromCGRect(cell.bounds));
}

但是,如果您的单元格仍然需要给定的预定义大小,则始终可以使用

至于宽度

对于自定义单元格,您可以创建如下方法

如果没有自定义单元格,则始终可以在创建UITableView的同一类中创建函数

它将返回表单元格的确切大小。我总是更喜欢第二种方法,因为有时你只是不创建设备宽度的单元格

至于身高

对于自定义单元格的情况,您可以创建这样的类方法

如果没有自定义单元格,则始终可以在创建UITableView的同一类中创建函数

您可以在UIViewController中使用,自定义单元格的单元格类名为[cellClassName myCellHeight]或[self myCellHeight]默认单元格位于表的-CGFloattableView:UITableView*tableView heightForRowAtIndexPath:NSIndexPath*indexPath数据源方法中


通过这些方法,您可以随时获得精确的单元格宽度/高度!:

但是,如果您的单元格仍然需要给定的预定义大小,则始终可以使用

至于宽度

对于自定义单元格,您可以创建如下方法

如果没有自定义单元格,则始终可以在创建UITableView的同一类中创建函数

它将返回表单元格的确切大小。我总是更喜欢第二种方法,因为有时你只是不创建设备宽度的单元格

至于身高

对于自定义单元格的情况,您可以创建这样的类方法

如果没有自定义单元格,则始终可以在创建UITableView的同一类中创建函数

您可以在UIViewController中使用,自定义单元格的单元格类名为[cellClassName myCellHeight]或[self myCellHeight]默认单元格位于表的-CGFloattableView:UITableView*tableView heightForRowAtIndexPath:NSIndexPath*indexPath数据源方法中


通过这些方法,您可以随时获得精确的单元格宽度/高度!:

在heightForRowAtIndexPath:中添加日志,并检查它是否返回正确的高度是,它返回正确的高度:您正在此处更改tableview样式。cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:@cell]。尽量不要更改默认设置。我在哪里更改它?您的意思是乘以0.28和0.08?在heightForRowAtIndexPath:中添加日志,并检查它是否返回正确的高度是,它返回正确的高度:您正在此处更改tableview样式。cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:@cell]。尽量不要更改默认设置。我在哪里改变它?你是说乘以0.28和0.08?
- (CGFloat)cellWidth {
    return yourTableView.frame.size.width;
}
+(CGFloat)myCellHeight {
    return 45.f;
}
-(CGFloat)myCellHeight {
    return 45.f;
}