Добавление подванного представления больше, чем Cellheight для UiableViewCell?
-
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];
Хотя изображение «переполняется» в ячейку под ним под ним, верхняя часть изображения всегда обрезана, как показано здесь:
Кто-нибудь знает, что я пытаюсь сделать, возможно с текущим подходом?
Или я должен просто понять способ нарисовать эти изображения на 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;
}
Когда он соответствовал высоте таблицы ячейки, не было не совпадало; Когда это было слишком маленькое, там было совпадение. Уменьшите вам, хотя я очень быстрый повод, поэтому я не уверен, что это очень хорошая идея, чтобы сделать это.