Я сделал прототип ячейки в 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 */
}

Вот результат.

Вот как это должно выглядеть всегда (и как это выглядит перед выбором ячейки)

Before going back

Когда ячейка была выбрана, новый контроллер представления был помещен в стек навигации, и я извлек этот контроллер представления, вернувшись назад, вот как это выглядит.

After going back

Обновление 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;
        */
    } 
}

Перед отправкой на другой контроллер представления:

Before pushing

После возврата из контроллера представления:

After going back

0
simonbs 10 Дек 2011 в 02:28
Можете ли вы показать код, где вы это делаете? И каким методом это делается?
 – 
Jim
10 Дек 2011 в 02:54
Я обновил ответ, чтобы показать код.
 – 
simonbs
10 Дек 2011 в 13:45
Я обновил ответ, чтобы показать два изображения (до и после нажатия, а затем вернуться)
 – 
simonbs
10 Дек 2011 в 13:46
Я вижу, вы устанавливаете фоновое изображение для своего ярлыка. Это хорошо, но для такой проблемы я бы на время отменил это и просто поставил цвет фона, чтобы был виден реальный размер этикетки (с изображением они могут "не согласиться"). Но я бы сказал интересный баг :)
 – 
makaron
10 Дек 2011 в 15:47
Я не устанавливаю фоновое изображение для ярлыка. Это UIImageView под меткой. Я попытался сохранить это изображение в прототипе ячейки, но удалил код, который устанавливает его размер и изображение в растягиваемое изображение. Я также попытался придать ярлыку красный цвет фона, чтобы увидеть его точный размер. Размер вроде правильный. Я обновил свой вопрос, чтобы показать код в том виде, в котором он есть, и новые скриншоты приложения.
 – 
simonbs
10 Дек 2011 в 20:20

1 ответ

Используйте этот код в своем cellForRowatindexpath, это решит вашу проблему

[[[cell contentView] subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
0
Dilip 3 Янв 2014 в 09:50