动态安排UITableViewCell - iOS

时间:2013-08-22 02:50:11

标签: ios dynamic uitableview

我有一个表格视图,其中包含一个从JSON响应中获取所有内容的单元格。

单元格的结构如下:

Name (can be one or two lines long)
Address (can be 3 or 4 lines long)
Instructions (can be 1 or 3 lines long) [these can be 'hidden' depending on what I get from JSON response]
Payment (can be 1 or 3 lines long) [these can be 'hidden' depending on what I get from JSON response]
    Button (which will need to move accordingly if other things are hidden) [this will be hidden if it is the zeroth cell in the table]

所有这些线条之间的间距都不同。

我的问题是,是否有一种简单的方法来动态排列所有内容,而不必指定给定特定响应的所有对象的(x,y,高度和宽度),我回来了?

我试着按照“可可是我的女朋友”的教程,但我不确定它是否适用于我的情况。

任何提示都将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:0)

我假设你在cell.contentView中添加标签没有任何问题。所有标签必须是相对的,您应该像这样计算文字大小以正确调整高度。

-(CGFloat) stringSize:(NSString *) str {

UIFont *myFont = [UIFont systemFontOfSize:15.0];

CGSize stringSize = [str sizeWithFont:myFont constrainedToSize:CGSizeMake(self.view.frame.size.width - 10, 999) lineBreakMode:UILineBreakModeWordWrap];

return stringSize.height + 15;
}

答案 1 :(得分:0)

如果我理解你的问题是正确的,你需要这样的东西(有固定的位置):

Label1    Label2                         Label5      Button1

显示如下(隐藏中间标签时的动态位置):

Label1    Label2    Label5    Button1

无需为每种可能的场景设置帧?

在这种情况下,我可能有一个想法,你可以试试。 据我所知,标签和按钮(以及textView或您想要使用的任何东西)都继承自UIView,它具有框架属性。我的想法是,当你知道要显示哪些标签和按钮时,你可以将它们放在一个数组中,将隐藏的那些留下,然后相对于彼此设置帧。像这样:

UILabel *label1 = ...;
UILabel *label2 = ...;
UILabel *label3 = ...;
UILabel *label4 = ...;
UIButton *button1 = ...;

//Let's say you later figure out you want to show labels 1 and 2, but not 3 and 4, but show the button:
NSMutableArray *elements = [[NSMutableArray alloc]init];
[elements addObject:label1];
[elements addObject:label2];
[elements addObject:button1];
//Not adding label3&4

//Now we have collected all the elements we WANT to show togehter in this array.
//Let's give them some good frames
//Loop through the array
for(int i = 0; i<elements.count; i++) //In this case, three times.
{
    UIView *element = (UIView*)[elements objectAtIndex:i];
    if(i == 0)
    {
        //Here we set the frame for the first element
        //This needs to be treated differently than the others, 
        //as their positions are relative to this
        CGRect previousFrame = element.frame;
        [element setFrame:CGRectMake(20, previousFrame.origin.y, previousFrame.size.width, previousFrame.size.height)];
        //Setting this first element to start at origin x=20
    }
    else
    {
        //If we get here, we know that we're not at the first element
        //so we can check where the previous element stopped, which is where we should start
        UIView *previousElement = [elements objectAtIndex:i-1];
        CGRect pef = previousElement.frame; //PreviousElementFrame
        //Let's say we want this element to start exactly where the previous element ended:
        CGRect pf= element.frame; //PreviousFrame
        [element setFrame:CGRectMake(pef.origin.x + pef.size.width + 20, pf.origin.y, pf.size.width, pf.size.height)];
        //I added +20 in origin.x to have some space so they're not completely stuck to eachother
    }
}

我使用CGRect previousFrame = element.frame;的原因是宽度和高度属性保持原样(如果显示所有元素,它们将是什么,固定位置和大小)。在某些用例中,我可以想象宽度和高度尚未正确设置,因此您可能会遇到一些时髦的结果。您可以通过在此循环之前单独设置所有元素的宽度和高度来解决此问题。我认为按钮比标签高,而且与textViews相同,这也意味着如果它们将水平对齐,它们也将具有不同的frame.origin.y值。不同的高度,来源不同。您也可以通过在else中添加另一个if语句来解决这个问题,例如if([element isKindOfClass:[UIButton class]]){//setWidthAndHeightForTheButton} else if([element isKindOfClass:[UITextView class]]){//setWidthAndHeightForAllTextViews} else{//setWidthAndHeightForLabels},但这完全取决于您使用的是哪些元素(标签,按钮,textViews,textFields等)。

要注意,我现在无法测试这个,而且我是“手动”编写的,所以这里可能会有错误。正如我所说,这只是一个可能有用的想法。 我假设您正在使用自定义tableViewCell,包含所有这些标签,因此要为tableView执行此操作,您可以将我写入的所有内容放入CustomCell.m中的方法中,并从cellForRowAtIndexPath:调用它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //blah blah
    cell.nameLabel.text = @"Fidel";
    cell.addressLabel.text = @"Cashflow City";
    cell.instructionsLabel.text = @""; //empty
    cell.paymentLabel.text = @""; //empty
    cell.thatButton.hidden = NO;
    //Now we don't want the empty labels to use valuable 'invisible' space.
    [cell arrangeElements];
}
customCell.h中的

-(void)arrangeElements;
customCell.m中的

-(void)arrangeElements
{
    NSMutableArray *elements = [[NSMutableArray alloc]init];
    if(![nameLabel.text isEqualToString:@""]) // if this label is NOT empty
        [elements addObject:nameLabel];
    //Repeat above for all elements

    //then put the rest of the code from above
}
哇,我真的被带走了......我想念我用来编程的电脑..