Я сделал прототип ячейки в Interface Builder. Этот прототип содержит изображение, размер которого должен меняться в зависимости от длины строки. Поэтому я написал метод в своем подклассе 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;
*/
}
}
Перед отправкой на другой контроллер представления:
После возврата из контроллера представления:
1 ответ
Используйте этот код в своем cellForRowatindexpath
, это решит вашу проблему
[[[cell contentView] subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].