スクロール画面で固定されたビューを実現するには
環境:iOS Deployment Target 7.1
スクロールする画面上でも固定されてスクロールしない View を実装する方法。
UIScrollViewDelegate プロトコルを実装して、スクロールする度に呼ばれるscrollViewDidScroll:
で scrollView.contentOffset プロパティの座標を取得して固定したいビューの座標に設定してあげればよい。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { _fixedView.frame = CGRectMake(100 + scrollView.contentOffset.x, 300 + scrollView.contentOffset.y, 100, 100); }
こんな感じ。
サンプルコード
FixedViewController.h
#import <UIKit/UIKit.h> @interface FixedViewController : UIViewController < UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate > @end
FixedViewController.m
#import "FixedViewController.h" @interface FixedViewController () @end @implementation FixedViewController { UITableView *_tableView; NSMutableArray *_items; UIView *_fixedView; // 固定するビュー } - (void)viewDidLoad { [super viewDidLoad]; _tableView = [[UITableView alloc] initWithFrame:[self.view bounds]]; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; // テストデータ _items = [NSMutableArray array]; for (int i = 0; i < 100; i++) { NSString *item = [NSString stringWithFormat:@"item %d", i]; [_items addObject:item]; } // 固定するビューの作成 _fixedView = [[UIView alloc] initWithFrame:CGRectMake(100, 300, 100, 100)]; _fixedView.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.5]; [_tableView addSubview:_fixedView]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 固定するビューの座標を設定 _fixedView.frame = CGRectMake(100 + scrollView.contentOffset.x, 300 + scrollView.contentOffset.y, 100, 100); } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _items.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; cell.textLabel.text = _items[indexPath.row]; if (indexPath.row % 2 == 0) { cell.backgroundColor = [UIColor whiteColor]; } else { cell.backgroundColor = [UIColor lightGrayColor]; } return cell; } @end