2012-01-30 2 views
7

У меня есть UITableView с обычным стилем - тот, который имеет белый фон и серые горизонтальные линии для разделения строк.Ввод пользовательского представления в UITableView

У меня есть другой пользовательский UIView, который представляет собой прямоугольник размером 100x100, заполненный красным цветом.

Как я могу поместить последний в первый, так что появляется над горизонтальными линиями, но по-прежнему является «частью» табличного представления в том смысле, что когда я просматриваю вид стола вокруг, красный просматривать свитки с ним? Фактически, я также должен был бы поместить мой палец в красную область и прокрутить представление таблицы.

Еще раз, если красный вид помещен для перекрытия некоторых горизонтальных линий, то должно появиться над линий. К сожалению, когда я просто добавляю красное представление в качестве представления в виде таблицы, горизонтальные линии пересекают красный вид; см. this screenshot.

Как это можно сделать?

+0

Вы хотите, чтобы красный вид скрыть содержимое линий ???? – shannoga

ответ

5

EDIT

Если вы пытаетесь добавить представление над строками (скрыть строки), попробуйте использовать – bringSubviewToFront:, чтобы взять его перед видом стола.

[self.tableView bringSubviewToFront:redView]; 

ELSE

Добавьте вид на self.tableView.tableHeaderView это поместить его над табличном и прокручивать с точки зрения таблицы.

UIView *redView = [[UIView alloc]init]; 
    redView.frame = //set the frame 
    redView.backgroundColor = [UIColor redColor]; 
    self.tableView.tableHeaderView = redView; 

Good Luck

+0

'bringSubviewToFront:' сделал трюк, спасибо. Мне не нужно было его называть несколько раз (в таких местах, как 'scrollViewDidScroll:' или 'layoutSubviews'), как предлагали некоторые другие. Я только что инициализировал свой красный вид в' viewWillAppear: '(в подклассе' UITableViewController'), а затем вызвал 'bringSubviewToFront:' в 'viewDidAppear '(Я поместил красное представление в переменную экземпляра) .Это отлично подойдет для меня. – Enchilada

+0

Вы всегда приветствуете – shannoga

0

Сделайте свой просмотр подвидным любым нормальным подзором UITableView: заголовком, нижним колонтитулом или любым UITableViewCell.

+0

Это не гарантировало бы, что он будет перед разделителями. Фактически это даже не гарантировало бы его видимость за пределами его содержимого сдерживания. – Ahti

1

Просто добавьте этот вид в UITableView, как подвид:

[tableView addSubview:myRedView]; 

См userInteractionEnabled свойства для того, чтобы обрабатывать взаимодействия и прокрутку.

+0

Проблема заключается в том, что горизонтальные линии табличного вида перекрывают красный вид. Красный вид должен быть ** над ** горизонтальными линиями. Какие-нибудь дальнейшие идеи? – Enchilada

+1

@ Enchilada, No, красный вид лежит на вершине UITableView. Я только что создал с нуля новый проект и напишу 3 строки кода в viewWillAppear, см. Результат здесь - http://img585.imageshack.us/img585/3584/screenshot20120131at112.png – beryllium

+0

Странно, это не то, что здесь происходит. Вот мой скриншот: http://i.stack.imgur.com/Ooaf0.png Любые идеи, почему наши результаты отличаются? – Enchilada

0

Я думаю, что то, что вы описали, может быть достигнуто с использованием UITableViewCell или даже подвид заголовка. Ячейка обладает неотъемлемой способностью прокручивать таблицу и может быть настроена так, как вам нравится. Это по существу мнение.

В вашей ситуации, например, может потребоваться, чтобы красная рамка отображалась по умолчанию в верхней части таблицы. Вы сделаете первую ячейку ячейкой «красного ящика», где вы вставляете свой красный ящик в представление содержимого ячейки.

0

Итак, ваша проблема в основном состоит в том, что UITableViewCells UITableView добавляются как Subviews динамически, и вы не можете контролировать, что они добавлены перед или позади вашего представления.

Чтобы сохранить ваше представление спереди, вам нужно вернуть его туда каждый раз, когда ячейки могут быть добавлены, что происходит при прокрутке UITableView.

Я хотел бы предложить вам попробовать добавить свой собственный вид как подвид, а затем переопределить -scrollViewDidScroll следующим образом:

- (void)scrollViewDidScroll { 
    [super scrollViewDidScroll]; 
    // myCustomView is your custom view referenced in an IVar 
    [self.tableView bringSubviewToFront:myCustomView]; 
} 
0

Корректировать viewWillAppear делегат с этими линиями

UIView *redView=[[UIView alloc]initWithFrame:CGRectMake(30,30, 100, 100)]; 
redView.backgroundColor=[UIColor redColor]; 
[self.tableView addSubview:redView]; 
12

Правильное место для обработки порядка размещения вашей красной площади находится в методе layoutSubviews. Вид таблицы отправляет себя layoutSubviews в любое время, когда он добавляет или удаляет subviews (и в другое время).

Вам нужно сделать подкласс UITableView, который имеет ссылку на красный квадрат:

@interface MyTableView : UITableView 

@property (weak, readonly) IBOutlet UIView *redSquare; 

@end 

Вы можете инициализировать redSquare любым способом вы хотите. Я просто положить его в моем пере вместе с табличным и переместил его, чтобы быть подтаблицами в виде таблицы в awakeFromNib:

@implementation MyTableView 

@synthesize redSquare = _redSquare; 

- (void)awakeFromNib { 
    [self addSubview:self.redSquare]; 
} 

Во всяком случае, на самом деле убедиться, что красный квадрат всегда на верхней части таблицы ячейки и линии сетки, переопределить layoutSubviews следующим образом:

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    [self bringSubviewToFront:self.redSquare]; 
} 
+0

Точно: ретрансляции UITableView всякий раз, когда ячейка добавляется или удаляется. Ячейки на самом деле являются просто подлогими таблицы и могут быть в любом порядке. –

+0

Не могли бы вы рассказать мне, как вы делаете то, что вы упомянули, в случае, если я не использую XIB-файл? Как я могу указать пользовательский подкласс без использования XIB? Я инициализирую свой UIT Подпроцессы под свойственным подпроцессом. – Enchilada

+0

Где-то ваш код говорит '[[UITableView alloc] init ...]'. Вам нужно заставить его сказать '[[MyTableView alloc] init ...]' и установить его свойство 'redSquare'. –