已经搜索了很长一段时间了,我仍然没有办法做到这一点。 我想将iPhone Spotlight的章节标题重现为UITableView。
滚动时,“常规”表格视图标题在部分顶部保持可见,我们都知道。但是在Springboard的Spotlight页面中有一种我从未见过的标题:在那里,标题跨越了截面的整个高度,并没有卡在截面的顶部,而是在左侧。这是怎么回事?
答案 0 :(得分:5)
好问题。我做了一个小实验。它几乎看起来像聚光灯下的景色。但它缺少一个导入功能。如果碰撞,较低的“图像”不会将上部图像推到顶部。
我怀疑有没有使用私有框架的内置解决方案。
我实现了这个目标:
正如您所看到的,顶部的两个标题图像重叠。它们不像普通标题那样互相推动。我不得不停用细胞分离器。如果我使用它们,它们会出现在整个细胞中。所以你必须自己画画。没有大碍。
但我不知道如何解决重叠问题。
以下是实现此目标的代码:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 1;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 44)];
contentView.backgroundColor = [UIColor lightGrayColor];
UIImageView *imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 34, 34)] autorelease];
imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d", section]];;
[contentView addSubview:imageView];
return [contentView autorelease];
}
答案 1 :(得分:4)
好的,我做过类似于音乐应用和聚光灯搜索的内容。
我没有子类化UITableView,我刚刚通过它的scrollViewDidScroll方法跟踪了这些部分,并将标题视图添加到tableView的左侧(所以你必须将tableview放在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中的外观如何,我使用了约束来在tableView的左边给出了44px
希望这有助于:)。
答案 2 :(得分:0)