如何在UITableView中动态设置单元格位置

时间:2016-06-17 08:13:09

标签: ios objective-c uitableview

我正在创建一个包含4个单元格的tableView。并且必须根据设备的方向将电池分成不同的尺寸。

第1列和第2列将具有相同的宽度,而第3列将是它们中的最大列,第4列将小于第3列但不小于第1列和第2列。

有没有办法动态地做到这一点?

Here is the template

我在计算宽度方面遇到了麻烦,这是我到目前为止所拥有的。我还没有创建l2,l3和l4但导致我在计算它的宽度方面遇到了困难

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cells" forIndexPath:indexPath];
UIInterfaceOrientation newOrientation =  [UIApplication sharedApplication].statusBarOrientation;
UILabel *typeLabel = [[UILabel alloc] init];
if (cell==nil)
{
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cells"];
}

if(newOrientation == UIInterfaceOrientationLandscapeLeft || newOrientation == UIInterfaceOrientationLandscapeRight)
{
     l1 = [[UILabel alloc] initWithFrame:CGRectMake((self.tableView.bounds.size.width/15+20), 50, self.tableView.bounds.size.width/12, 21)];

}
else
{
     l1 = [[UILabel alloc] initWithFrame:CGRectMake((self.tableView.bounds.size.width/15+50), 50, self.tableView.bounds.size.width/12, 21)];
}


[cell.contentView l1];
[cell.contentView l2];
[cell.contentView l3];
[cell.contentView l4];

return cell;
}

1 个答案:

答案 0 :(得分:0)

创建名为“CustomCell”的自定义TableView单元格。您可以使用带有xib选项的新文件来创建它。

<强> CustomCell.h

@interface CustomCell : UITableViewCell
@end

<强> CustomCell.m

@implementation MessagesTableViewCell
    //perform your custom implementation here.
@end

<强> CustomCell.xib 使用自动布局调整用户界面中单元格中的标签。您可以根据需要添加4个标签,前2个标签具有恒定宽度,最后一个标签具有您想要的宽度,并让中心(第3个)标签跨越第2个标签和第4个标签。它将帮助您以更轻松的方式管理UI。自动布局是一项有助于构建不同尺寸内容的功能。您可以使用https://www.sitepoint.com/self-sizing-cells-uitableview-auto-layout/

处的自动布局查找动态表格视图单元格

在TableView类

中使用它
static NSString *cellIdentifier = @"CustomCell";

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

    CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    return cell;
}

我希望这会对你有所帮助。

使用程序化计算和方向更改

更新了代码实施
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        /////////////////////////Programatic Implementation///////////////////////////////////
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

        if(cell==nil){
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
        }

        if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
            //orientation is Portrait
            long widthForL1L2 = tableView.frame.size.width * .10;
            long widthForL3 = tableView.frame.size.width * .60;
            long widthForL4 = tableView.frame.size.width * .20;

            UILabel *l1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, widthForL1L2, cell.frame.size.height)];
            l1.backgroundColor = [UIColor redColor];
            [cell addSubview:l1];

            UILabel *l2 = [[UILabel alloc] initWithFrame:CGRectMake(widthForL1L2, 0, widthForL1L2, cell.frame.size.height)];
            l2.backgroundColor = [UIColor yellowColor];
            [cell addSubview:l2];

            UILabel *l3 = [[UILabel alloc] initWithFrame:CGRectMake(l2.frame.origin.x+widthForL1L2, 0, widthForL3, cell.frame.size.height)];
            l3.backgroundColor = [UIColor greenColor];
            [cell addSubview:l3];

            UILabel *l4 = [[UILabel alloc]initWithFrame:CGRectMake(l3.frame.origin.x+widthForL3, 0, widthForL4,cell.frame.size.height)];
            l4.backgroundColor = [UIColor blueColor];
            [cell addSubview:l4];
        }else{
            //orientation is Landscape
            //perform the same calculation as above or modify it according to your needs in landscape orientation.
        }   

        return cell;
    }

不要忘记 以包含此方向更改功能。当手机方向改变时,此功能调用表重新加载。

//Available iOS version >=8.0
    -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
        [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

        //Reload the tableview on orientation change, to match the new width of the table.
        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            [self.tableView reloadData];
        } completion:nil];

    }