Метка в UITableViewCell меняет положение - PullRequest
0 голосов
/ 10 декабря 2011

Я сделал прототип ячейки в Интерфейсном Разработчике. Этот прототип содержит изображение, которое должно менять размер в зависимости от длины строки. Поэтому я написал метод в своем подклассе 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

1 Ответ

0 голосов
/ 03 января 2014

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

[[[cell contentView] subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
...