Добавление подванного представления больше, чем Cellheight для UiableViewCell?

StackOverflow https://stackoverflow.com/questions/2842964

  •  27-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь добавить подзрегующую способность к UiableViewCell и дизайну, который я работаю, с требованиями, чтобы этот конкретный субвент (изображение) должен быть больше, чем фактический UIBIEViewCell, и, следовательно, частично перекрывать его братья и сестер.

Поэтому я настроил свой стол в таблице, создал свой образ и добавил его в ContentView Cell:

// rowHeight for the UITableView is 45.0f

UIImage *image = [self createCellThumbnail: someImage];
UIImageView *thumbView = [[UIImageView alloc] initWithFrame: CGRectMake(150, -5, 55,55)];
thumbView.transform = CGAffineTransformMakeRotation(0.1f);
thumbView.image = image;

cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;

[cell.contentView addSubview: thumbView];

Хотя изображение «переполняется» в ячейку под ним под ним, верхняя часть изображения всегда обрезана, как показано здесь:

img

Кто-нибудь знает, что я пытаюсь сделать, возможно с текущим подходом?

Или я должен просто понять способ нарисовать эти изображения на UiableView после того, как все клетки нарисованы (это не прокрутка таблицы, так что это будет работать и быть довольно легким).

Обновлять:

Также попытались добавить следующее: безрезультатно:

cell.opaque = NO;
cell.contentView.opaque = NO;

cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;

cell.clipsToBounds = NO;    
cell.contentView.clipsToBounds = NO;
Это было полезно?

Решение

Мне кажется, что TableView отображает свою клетку снизу вверх, поэтому клетки над одной ячейкой перекрываются на то, что одна ячейка. Чтобы избежать этого, вам придется установить backgroundColor всех клеток к +[UIColor clearColor] так что вы не будете видеть эти проблемы совпадают.

Но установка backgroundColor чтобы прояснить внутри -tableView:cellForRowAtIndexPath: не имеет никакого смысла. Uikit делает много вещей с ячейкой, прежде чем она нарисована, так что это сбрасывает backgroundColor Собственность ячейки.

Что нам нужно сделать, это установить backgroundColor в более позднем состоянии. К счастью, есть это -[UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath:] Что мы можем реализовать так:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor clearColor];
}

Теперь мы устанавливаем backgroundColor Незадолго до того, как ячейка нарисована, это оказывается работать.

Другие советы

ОБНОВИТЬ:

Поэтому я проделал еще несколько экспериментов, и следующее решение по-прежнему работает без необходимости устанавливать фона клетки к прозрачности, это включало в себя перемещение Z по порядку крытой ячейки. Это работает с выделением и выбором другой ячейки (через соответствующие обратные вызовы), и если два фона ячейки являются разными цветами. Решение заключается в следующем (вы можете игнорировать didHighlight а также didSelect Методы, если они не имеют значения для вас):

(Обратите внимание, что «крытая строка» является тем, чье содержание мы пытаемся сохранить видимо, и в моем случае его содержимое слегка идет в ряд выше, которое его отваливают)

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == ROW_ABOVE_COVERED_ROW)
    {
        NSIndexPath * rowbelow = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:rowbelow];
        [cell.superview bringSubviewToFront:cell];
    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == ROW_ABOVE_COVERED_ROW)
    {
        NSIndexPath * rowbelow = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:rowbelow];
        [cell.superview bringSubviewToFront:cell];
    }
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0 && indexPath.row == COVERED_ROW)
    {
        [cell.superview bringSubviewToFront:cell];
        cell.contentView.superview.clipsToBounds = NO;
    }
}

ПРИМЕЧАНИЕ. Вы также должны установить цвет фона вашего контента, чтобы очистить, или он будет принимать BGCLOR от остальной части вашей клетки, и поэтому, когда вам удается привести свой контент на переднюю часть покрывающей клетки, это займет фон цвет с ним и оставьте неприятный глядя в другой камере (в моем случае мой единственный контент был detailTextLabel и то textLabel):

// in cellForRowAtIndexPath:
[cell setBackgroundColor:[UIColor redColor]]; //using red for debug
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.backgroundColor = [UIColor clearColor];

Я надеюсь, что это полезно для того, чтобы кто-нибудь еще пытался это ....

Оригинал:

Для меня решение было использовано:

self.contentView.superview.clipsToBounds = NO;

Мои клетки уже были прозрачными, но мой контент все еще был обрезан. В моем случае я использовал пользовательскую ячейку, которая перемещает его контент в layoutSubviews. Отказ Так layoutSubviews Для моей пользовательской камеры завели следующим образом:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.contentView.frame = CGRectOffset(self.contentView.frame, 0, -11);
    self.contentView.superview.clipsToBounds = NO;
}

Я не знаю, будет ли это работать, если бы ячейку выше была непрозрачной, или если клетки должны были выделить при нажатии, будет ли это прикрыть мой контент.

Однако я не нужно сделать ячейку прозрачной снова в viewWillDisplayCell Метод обратного вызова - делать это в обычном cellForRowAtIndexPath было достаточно

У меня была эта проблема, и я позаботился о том, чтобы указать основной фону пользовательских таблицы Child Cleans проверен, и она решила проблему. Это было с пользовательской ячейкой TableView, загруженной из XIB. Не совсем одинаково, но подобная ситуация.

Я на самом деле имел противоположность только вчера, я создал пользовательскую таблицу клетки и по какой-то причине я получил переполнение, которое я не хотел иметь. Мое решение было, чтобы добавить следующий код в My View Controller Class:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    return 175;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top