読者です 読者をやめる 読者になる 読者になる

なかじまの開発ブログ

アプリ開発における備忘録などなど。

MENU

UITableViewのスクロールをボタンで制御する【Objective-C】

f:id:s_nakajima:20160530122722p:plain

Objective-Cが終わりつつあると感じているなかじまです(´・ω・`)

今回はUITableViewのスクロールをUIButtonで制御しつつ、セルの表示に合わせてボタンの表示非表示も一緒にメモします!

storyboardのUIViewにUITableViewとUIButtonを2つ設置します。

f:id:s_nakajima:20160530122155p:plain

設置したUIをOutlet接続し、ボタンはAction接続もします。

『.h』

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITableVIew *_tableView;
@property (weak, nonatomic) IBOutlet UIButton *upBtn;
@property (weak, nonatomic) IBOutlet UIButton *downBtn;

- (IBAction)upBtnTap:(id)sender;
- (IBAction)downBtnTap:(id)sender;

セルの表示処理部分は省きます。

『.m』

@synthesize _tableView;
@synthesize upBtn;
@synthesize downBtn;

- (void)viewDidLoad {
    [super viewDidLoad];

    _tableView.delegate = self;
    _tableView.dataSource = self;

    // tableViewのスクロール検知を実行しておく
  [self scrollViewDidScroll:_tableView];
}

/* スクロール終了検知 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // セルが表示範囲を超えてない場合
    if (_tableView.contentOffset.y < _tableView.frame.size.height) {
        // 上ボタンを非表示
        upBtn.hidden = YES;
        // 下ボタンを非表示
        downBtn.hidden = YES;
    }
    // 一番下までスクロールしている場合
    else if (_tableView.contentOffset.y >= _tableView.contentSize.height - _tableView.frame.size.height) {
        // 上ボタンを表示
        upBtn.hidden = NO;
        // 下ボタンを非表示
        downBtn.hidden = YES;
    }
    // 一番上までスクロールしている場合
    else if (_tableView.contentOffset.y == 0) {
        // 上ボタンを非表示
        upBtn.hidden = YES;
        // 下ボタンを表示
        downBtn.hidden = NO;
    }
    // それ以外
    else {
        // 上ボタンを表示
        upBtn.hidden = NO;
        // 下ボタンを表示
        downBtn.hidden = NO;
    }
}


/* 上ボタン押下処理 */
- (IBAction)upBtnTap:(id)sender {
    NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:CGPointMake(0, _tableView.contentOffset.y + 1)];
    if (indexPath && indexPath.row > 0) {
        indexPath = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:0];
        [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animation:YES];
    }
}

/* 下ボタン押下処理 */
- (IBAction)downBtnTap:(id)sender {
    NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:CGPointMake(0, _tableView.contentOffset.y + 1)];
    if (indexPath) {
        indexPath = [NSIndexPath indexPathForRow:indexPath.row + 1 inSection:0];
        [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animation:YES];
    }
}