我的应用中已有一个已存在的表视图,我试图添加一个新的单元格。新单元格将显示可变数量的按钮,每个按钮都有一个标题(因此是动态宽度)。新单元应该看起来像这样:
┃┃ ┃┃ <---- existing cells above
┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┃
┃┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃
┃┃┏━━━━━┓ ┏━━━━━━━━━━━━━━━━━━━┓ ┃┃
┃┃┃ 632 ┃ ┃ 12345678901728933 ┃ ┃┃
┃┃┗━━━━━┛ ┗━━━━━━━━━━━━━━━━━━━┛ ┃┃
┃┃┏━━━━━━━━━━━┓ ┏━━━━━━┓ ┏━━━━━━┓ ┃┃
┃┃┃ 123345573 ┃ ┃ jhkl ┃ ┃ dasd ┃ ┃┃ <---- new cell
┃┃┗━━━━━━━━━━━┛ ┗━━━━━━┛ ┗━━━━━━┛ ┃┃
┃┃┏━━━┓ ┏━━━━━━━━━━━━━━┓ ┏━━━┓ ┃┃
┃┃┃ 1 ┃ ┃ 128732434554 ┃ ┃ 1 ┃ ┃┃
┃┃┗━━━┛ ┗━━━━━━━━━━━━━━┛ ┗━━━┛ ┃┃
┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┃
┃┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃
┃┃ ┃┃ <---- existing cells below
按钮应该在一行上文件,直到下一行按钮溢出单元格,此时它应该换行到下一行(类似于带有自动换行的UILabel)。
UITableViewAutomaticDimension
方法返回tableView:heightForRowAtIndexPath
,单元格需要计算自己的高度。cellForRowAtIndexPath
返回单元格之前填充。beginUpdates/endUpdates
来调整其单元格大小的解决方案。[UIScreen mainScreen]
来计算单元格的理想宽度。< / LI>
醇>
intrinsicContentSize
。此实现将返回集合视图的contentSize
,或集合视图的UICollectionViewFlowLayout的collectionViewContentSize()
(我尝试了两者)。这里的问题是这些值在设置collectionView之前不会返回实际的内容大小,此时我的UITableView已经将单元格高度缓存为0。layoutSubviews
之前没有设置,此时UITableView已经缓存了单元格的高度。我尝试使用类似https://github.com/xhacker/TagListView的内容,其中自定义视图在调用layoutSubviews
时手动计算所有内容的帧并报告(行数)*(每行的高度)作为其内在内容高度,但问题是,当计算发生时,视图的帧为0(因为它被布置在UITableViewCell内),因此内在内容大小计算错误,结果在这样的事情:
┃┃ ┃┃ <---- existing cells above
┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┃
┃┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃
┃┃┏━━━━━┓ ┏━━━━━━━━━━━━┓ ┃┃
┃┃┃ 632 ┃ ┃ 6327237842 ┃ ┃┃
┃┃┗━━━━━┛ ┗━━━━━━━━━━━━┛ ┃┃
┃┃┏━━━━━━━━━━━━━━━━━━━┓ ┃┃
┃┃┃ 12345678901728933 ┃ ┃┃
┃┃┗━━━━━━━━━━━━━━━━━━━┛ ┃┃
┃┃ ┃┃
┃┃ ┃┃ <---- new cell
┃┃ ┃┃
┃┃ ┃┃
┃┃ ┃┃
┃┃ ┃┃
┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┃
┃┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃
┃┃ ┃┃ <---- existing cells below
通常,UITableView缓存单元格的高度会导致存在一个名为UIView-Encapsulated-Layout-Height的约束,其常量为0,并在许多SO帖子中有详细记录。据我所知,无法从单元格级别重新计算此高度:setNeedsUpdateConstraints
,setNeedsLayout
,layoutIfNeeded
,invalidateIntrinsicContentSize
和任何我试过的组合没有帮助。
过去两天,这让我很困惑。我想知道是否有人之前已经实现了这样的任何事情并找到了一个可靠的方法,或者可以就如何解决这个问题提供任何建议。
答案 0 :(得分:-1)
将此写入表cellforRowAtIndexPath方法。
y=20;
x=20;
for (int i=0; i<[arrAssignUsers count]; i++) {
CGRect screenRect=[[UIScreen mainScreen]bounds];
CGFloat screenWidth=screenRect.size.width;
[arrBtnStatus addObject:[NSNumber numberWithBool:NO]];
NSString *strNames=[arrAssignUsers objectAtIndex:i];
stringsize=[strNames sizeWithAttributes:
@{NSFontAttributeName: [UIFont systemFontOfSize:20.0f]}];
btn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
CGFloat m=x+stringsize.width+10;
CGFloat n=screenWidth-20;
if (m<=n) {
btn.frame=CGRectMake(x, y,stringsize.width,stringsize.height);
x=x+stringsize.width +10;
}
else
{
y=y+stringsize.height+10;
x=20;
btn.frame=CGRectMake(x, y,stringsize.width,stringsize.height);
x=x+stringsize.width+10;
}
[btn setTitle:self.arrAssignUsers[i] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
btn.tag=i;
[btn addTarget:self
action:@selector(notifyButtonPressedInEditTask:) forControlEvents:UIControlEventTouchUpInside];
btn.backgroundColor=[UIColor whiteColor];
btn.layer.cornerRadius=10;
[btn.layer setMasksToBounds:YES];
btn.layer.borderWidth=2.0f;
btn.layer.borderColor=[UIColor orangeColor].CGColor;
[self checkNotifybtnStatus:btn];
[cell addSubview:btn];
return cell;
然后写下这个方法:
-(void)checkNotifybtnStatus:(UIButton *)clicked{
state = [[arrBtnStatus objectAtIndex:clicked.tag]boolValue];
if ((clicked.tag>=0)&&(state==YES)) {
clicked.backgroundColor=OS_ORANGE_COLOR;
}
else
clicked.backgroundColor=[UIColor clearColor];
}
然后写下来。
-(void)notifyButtonPressedInEditTask:(id)sender{
UIButton *clicked = (UIButton *) sender;
NSLog(@"%ld",(long)clicked.tag); //Here you know which button has pressed
for (UserListData *taskData in arrAssignUserInfoList) {
[arrNotifyUsers addObject:taskData.strUniqID];
}
state = [[arrBtnStatus objectAtIndex:clicked.tag]boolValue];
if ((clicked.tag>=0)&&(state==NO)) {
[arrBtnStatus replaceObjectAtIndex:clicked.tag withObject:[NSNumber numberWithBool:!state]];
clicked.backgroundColor=[UIColor colorWithRed:254.0/255.0 green:139.0/255.0 blue:26.0/255.0 alpha:1];
[arrNotifySelectedUsers addObject:[arrNotifyUsers objectAtIndex:clicked.tag]];
NSLog(@" arr new--%@",arrNotifySelectedUsers.description);
}
else
{
clicked.backgroundColor=[UIColor clearColor];
[arrBtnStatus replaceObjectAtIndex:clicked.tag withObject:[NSNumber numberWithBool:!state]];
[arrNotifySelectedUsers removeObject:[arrNotifyUsers objectAtIndex:clicked.tag]];
NSLog(@" arr new--%@",arrNotifySelectedUsers.description);
}
}
根据您的项目更改变量。 这可能会对你有所帮助。