用户首先在页面顶部看到图像;页面的其余部分是图像正下方的UITableView。
当用户在桌面上滑动时,我想向上滑动整个UITableView以覆盖图像,然后开始滚动表格单元格。向下滑动(一旦第一个单元格位于顶部),UITableView将向下滑动以再次显示图像。
这类似于Crackle app(和其他应用程序)所做的。这样做的好/优雅方式是什么?
答案 0 :(得分:0)
通过设置框架来更改TableView的位置, self.tableView.frame = self.view.frame in -scrollViewWillBeginDragging:
答案 1 :(得分:0)
毫无疑问,有几种方法可以实现这一目标。在途中涉及在第一个单元格内部放置该图像,这与您的数据中的其他单元格不同。滚动时,单元格中图像的位置将向下移动,这样可能会使图像被下面的单元格覆盖。下面的代码显示了如何执行此操作(我从具有交替行的另一个项目中修改了此项,这些行似乎浮动在固定图像上)。
@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@end
@implementation TableController
- (void)viewDidLoad {
[super viewDidLoad];
self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine",@"Black",@"Brown",@"Red",@"Orange",@"Yellow",@"Green",@"Blue"];
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
RDCell *topCell = (RDCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
[topCell updateImageViewWithOffset:scrollView.contentOffset.y];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.theData.count + 1;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat height = (indexPath.row == 0)? 140 : 44;
return height;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0) {
RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ImageCell" forIndexPath:indexPath];
return cell;
}else{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = self.theData[indexPath.row - 1];
return cell;
}
}
自定义单元格中的代码只是这一种方法,
-(void)updateImageViewWithOffset:(CGFloat) offset {
CGFloat cellY = self.frame.origin.y;
self.topCon.constant = offset - cellY;
}
topCon是NSLayoutConstraint的IBOutlet,位于单元格的顶部和单元格中图像视图的顶部之间 - 图像视图对单元格的顶部和侧面有约束,这很重要,和一个高度约束(等于单元格的高度),但没有约束到单元格的底部。如果您想查看此方法是否为您提供所需的外观,可以从此处下载示例项目http://jmp.sh/zOVz6Ev。