Я сделал прототип ячейки в Интерфейсном Разработчике. Этот прототип содержит изображение, которое должно менять размер в зависимости от длины строки.
Поэтому я написал метод в своем подклассе UITableViewCell, чтобы вычислить ширину текстовой строки с заданным шрифтом и установить эту ширину в качестве ширины изображения.
Это работает нормально, пока я не нажму на другой контроллер представления, а затем вернусь к своему виду таблицы. Затем вид был перемещен примерно на 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 */
}
Это результат.
Вот как это должно выглядеть всегда (и как оно выглядит перед выбором ячейки)
Когда ячейка была выбрана, новый контроллер представления был помещен в стек навигации, и я поднял этот контроллер представления, вернувшись назад, вот как он выглядит.
Обновление 2:
Я сохранил изображение в прототипе ячейки, но прокомментировал код, устанавливающий его размер и растягиваемое изображение. Я также изменил цвет фона метки на сплошной красный, чтобы увидеть точный размер метки. Размер кажется правильным.
Теперь это мой - (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;
*/
}
}
Перед нажатием на другой контроллер вида:
После возврата из контроллера вида: