我在Interface Builder中制作了一个原型单元格。该原型包含一个imageview,它应根据字符串的长度改变大小。 因此,我在UITableViewCell的子类中编写了一个方法来计算具有给定字体的文本字符串的宽度,并将此宽度设置为imageview的宽度。 这工作正常,直到我推送到另一个视图控制器,然后返回到我的表视图。然后视图重新定位在右侧约20个像素。
有谁知道为什么会这样?如果我将x位置设置为静态的,例如, 200。
更新1:
在我的- (UITableViewCell *)tableView:cellForRowAtIndexPath:
中,我使用了我的UITableViewCell的子类DFolderCell
。这会调用方法- (void)updateIndicatorsCount:andStarred
来设置count
和starred
标签的值,并使这些标签以及图片countIcon
和starredIcon
的宽度为带有给定字体的_count
和_starred
的宽度。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"folderCell";
DFolderCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[DFolderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
int index = indexPath.row;
Folder *folder = (Folder *) [folders objectAtIndex:index];
FolderIcon icon = (FolderIcon) folder.icon.intValue;
cell.name.text = folder.name;
cell.icon.image = [[DFolders sharedFolders] imageForFolderIcon:icon];
int count = [[DDrafts sharedDrafts] amountOfDraftsInFolder:folder withType:DraftLoadTypeRecent];
int starred = [[DDrafts sharedDrafts] amountOfDraftsInFolder:folder withType:DraftLoadTypeStarred];
[cell updateIndicatorsCount:count andStarred:starred];
return cell;
}
以下方法是我的子类DFolderCell
/* Update size of count and starred indicators */
- (void)updateIndicatorsCount:(int)_count andStarred:(int)_starred
{
UIFont *badgeFont = [UIFont systemFontOfSize:11.0];
UIImage *background;
_count = 1000; // Test
if (_count > 0)
{
self.count.text = [NSString stringWithFormat:@"%i", _count];
CGSize size = [self.count.text sizeWithFont:badgeFont];
CGRect frame = self.countIcon.frame;
frame.size.width = size.width;
frame.origin.x = 320 - 20 - size.width;
self.countIcon.frame = frame;
self.count.frame = frame;
background = [UIImage imageNamed:@"Folders_Badge_Count.png"];
self.countIcon.image = [background stretchableImageWithLeftCapWidth:2 topCapHeight:2];
self.count.hidden = NO;
self.countIcon.hidden = NO;
}
/* Code for _starred is similar to code for _count */
}
结果就是这样。
这应该总是看起来(以及它在选择单元格之前的外观)
当选择了一个单元格时,一个新的viewcontroller已经被推到了导航堆栈上,我通过返回弹出了这个视图控制器,这就是它的外观。
更新2:
我将imageview保留在单元格原型中,但将代码设置为可伸缩图像,将其大小和图像设置为注释。我还将标签的背景颜色更改为纯红色,以查看标签的确切大小。大小似乎是正确的。
这是我的- (void)updateIndicatorsCount:andStarred:
方法。
- (void)updateIndicatorsCount:(int)_count andStarred:(int)_starred
{
UIFont *badgeFont = [UIFont systemFontOfSize:11.0];
// UIImage *background;
_count = 1000;
if (_count > 0)
{
self.count.text = [NSString stringWithFormat:@"%i", _count];
CGSize size = [self.count.text sizeWithFont:badgeFont];
CGRect frame = self.countIcon.frame;
frame.size.width = size.width;
frame.origin.x = 320 - 30 - size.width;
self.count.frame = frame;
self.count.hidden = NO;
self.count.backgroundColor = [UIColor redColor];
/* DON'T DO ANYTHING TO THE IMAGE */
/*
background = [UIImage imageNamed:@"Folders_Badge_Count.png"];
self.countIcon.hidden = NO;
self.countIcon.image = [background stretchableImageWithLeftCapWidth:2 topCapHeight:2];
self.countIcon.frame = frame;
*/
}
}
在推送到另一个视图控制器之前:
从视图控制器返回后:
答案 0 :(得分:0)
在cellForRowatindexpath
中使用此代码可解决您的问题
[[[cell contentView] subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];