Хорошо, я сделал что-то похожее на то, что делает музыкальное приложение и поиск в центре внимания.
Я не подклассифицировал UITableView, я только что просмотрел разделы с помощью метода scrollViewDidScroll и добавил заголовки слева от tableView (так что вам нужно будет поместить viewview вправо в представлении viewController, который означает, что вы не можете использовать UITableViewController).
этот метод должен быть вызван в scrollViewDidScroll, ViewDidLoad, и в didRotateFromInterfaceOrientation: (если вы поддерживаете вращение)
иметь в виду, что вам придется сделать пространство слева равен размеру заголовков в любая поддерживаемая вами ориентация интерфейса.
-(void)updateHeadersLocation
{
for (int sectionNumber = 0; sectionNumber != [self numberOfSectionsInTableView:self.tableView]; sectionNumber++)
{
// get the rect of the section from the tableview, and convert it to it's superview's coordinates
CGRect rect = [self.tableView convertRect:[self.tableView rectForSection:sectionNumber] toView:[self.tableView superview]];
// get the intersection between the section's rect and the view's rect, this will help in knowing what portion of the section is showing
CGRect intersection = CGRectIntersection(rect, self.tableView.frame);
CGRect viewFrame = CGRectZero; // we will start off with zero
viewFrame.size = [self headerSize]; // let's set the size
viewFrame.origin.x = [self headerXOrigin];
/*
three cases:
1. the section's origin is still showing -> header view will follow the origin
2. the section's origin isn't showing but some part of the section still shows -> header view will stick to the top
3. the part of the section that's showing is not sufficient for the view's height -> will move the header view up
*/
if (rect.origin.y >= self.tableView.frame.origin.y)
{
// case 1
viewFrame.origin.y = rect.origin.y;
}
else
{
if (intersection.size.height >= viewFrame.size.height)
{
// case 2
viewFrame.origin.y = self.tableView.frame.origin.y;
}
else
{
// case 3
viewFrame.origin.y = self.tableView.frame.origin.y + intersection.size.height - viewFrame.size.height;
}
}
UIView* view = [self.headerViewsDictionary objectForKey:[NSString stringWithFormat:@"%i", sectionNumber]];
// check if the header view is needed
if (intersection.size.height == 0)
{
// not needed, remove it
if (view)
{
[view removeFromSuperview];
[self.headerViewsDictionary removeObjectForKey:[NSString stringWithFormat:@"%i", sectionNumber]];
view = nil;
}
}
else if(!view)
{
// needed, but not available, create it and add it as a subview
view = [self headerViewForSection:sectionNumber];
if (!self.headerViewsDictionary && view)
self.headerViewsDictionary = [NSMutableDictionary dictionary];
if (view)
{
[self.headerViewsDictionary setValue:view forKey:[NSString stringWithFormat:@"%i", sectionNumber]];
[self.view addSubview:view];
}
}
[view setFrame:viewFrame];
}
}
мы также должны объявить свойство, которое будет держать мнение, которые видны:
@property (nonatomic, strong) NSMutableDictionary* headerViewsDictionary;
эти методы возвращают ось размера и X смещение взглядов заголовка:
-(CGSize)headerSize
{
return CGSizeMake(44.0f, 44.0f);
}
-(CGFloat)headerXOrigin
{
return 10.0f;
}
Я создал код, чтобы удалить любой вид заголовка, который не нужен, поэтому нам нужен метод, который возвращал бы представление при необходимости:
-(UIView*)headerViewForSection:(NSInteger)index
{
UIImageView* view = [[UIImageView alloc] init];
if (index % 2)
{
[view setImage:[UIImage imageNamed:@"call"]];
}
else
{
[view setImage:[UIImage imageNamed:@"mail"]];
}
return view;
}
вот как это будет выглядеть:


Как это будет выглядеть в Lanscape, я использовал контрсилами дать 44px в левой части Tableview
надеюсь, что это поможет :).
На самом деле, сочетание обоих звуков довольно эффективно. Добавление поднабора в представлении таблицы, которое находится рядом с ячейками, наряду с «отступом» ячеек, чтобы таблица и вид сбоку не перекрывались. –
да. Я считаю, что это забавный эксперимент пользовательского интерфейса в любом случае, и id будет интересоваться, если вы сможете получить желаемые результаты :) –
Ну, видимо, это возможно, так как я сделал это с моим прототипом. Но это требует большой помощи со стороны datasource/delegate, а также для «отступов» ячеек и заголовков разделов. Не могу понять, как сделать все это самодостаточным в самом представлении таблицы, но я думаю, я не могу быть слишком придирчивым. –