uitoolbarの同時タッチを防ぐ

26
potatotips UIToolbarの同時タッチを防ぐ デンソーアイティーラボラトリ @sonson_twit 吉田悠一

Upload: yuichi-yoshida

Post on 27-Jun-2015

4.994 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: UIToolbarの同時タッチを防ぐ

potatotips UIToolbarの同時タッチを防ぐ

デンソーアイティーラボラトリ @sonson_twit 吉田悠一

Page 2: UIToolbarの同時タッチを防ぐ

本業

Page 3: UIToolbarの同時タッチを防ぐ

自己紹介

Page 4: UIToolbarの同時タッチを防ぐ

sonsongithubで検索

Page 5: UIToolbarの同時タッチを防ぐ

2tchのモジュールをOSSに

• UZMultipleLayeredPopoverController

• UZTextView

• UZInputCandidateAccessory

Page 6: UIToolbarの同時タッチを防ぐ

コードの保守性を高めるために

• モジュールを切り出して公開する

Page 7: UIToolbarの同時タッチを防ぐ

本日のお題

@sonson_twit http://sonson.jp

Page 8: UIToolbarの同時タッチを防ぐ

まずはこの症状をご覧ください

Page 9: UIToolbarの同時タッチを防ぐ
Page 10: UIToolbarの同時タッチを防ぐ
Page 11: UIToolbarの同時タッチを防ぐ

問題点

• 同時入力できてしまう

• ツールバーのボタン

• UINav.Con.のジェスチャ

!

• UIViewControllerの階層構造が壊れる

• MobileSafariはロックして回避しているようだ

Page 12: UIToolbarの同時タッチを防ぐ

対策案

• UIBarButtonItemに対策を施す

• exclusiveTouch?

• UIBarButtonItemからdownとupを奪う

Page 13: UIToolbarの同時タッチを防ぐ

exclusiveTouch

• 役立たず

• だが,ツールバー上のボタン二つ同時押しは避けることができた

Page 14: UIToolbarの同時タッチを防ぐ

/**! * UIToolbarでボタンふたつの同時押しを防止する.! **/!- (void)setExclusiveForUIBarButtonsOnToolbar {!! for (UIView* view in [self.navigationController.toolbar subviews]) {!! ! view.exclusiveTouch=YES;!! }!}

これもグレーといえば,グレー

Page 15: UIToolbarの同時タッチを防ぐ

UIBarButtonItemのイベント

• タップイベントの横取りが直接できない

• C2ToolbarButton - undocumented class

• viewからswizzlingでタップイベントを奪う

• customにしてUIButtonを内蔵する

• UIToolbarにジェスチャをつける

Page 16: UIToolbarの同時タッチを防ぐ

Undocumented API

• ダメですわ・・・・

Page 17: UIToolbarの同時タッチを防ぐ

Swizzling

• え・・・そんなんやりたくないです

• 昔,リジェクトされたし・・・・

Page 18: UIToolbarの同時タッチを防ぐ

UIButton in UIBarButtonItem

• え・・・汎用性なくなりますよ

• Storyboardのボタンを全部作り替えるとか

• 難のためにそんなアホなことを

• 嫌です

Page 19: UIToolbarの同時タッチを防ぐ

/**! * UIButtonをUIBarButtonItemにセット! * addTergetで触ったタイミングを検出・・・! **/!UIButton *insideButton = [UIButton buttonWithType:UIButtonTypeCustom];!insideButton.bounds = CGRectMake(0, 0, 44, 44);![insideButton setImage:[UIImage imageNamed:@"hoge.png"] forState:UIControlStateNormal];!UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:insideButton];

ないわー,絶対ないわー!Storyboardとか使えないですやん

Page 20: UIToolbarの同時タッチを防ぐ

UIToolbarにジェスチャ

• UIGestureRecognizerのサブクラスを実装

• touchesBegin

• touchesCancelled, touchesEnded

• ジェスチャは失敗させる

• UINavigationControllerにコールバック

• interactiveGestureRecognizer.enable

Page 21: UIToolbarの同時タッチを防ぐ

- (void)viewDidLoad {! [super viewDidLoad];!! C2ToolbarTapGestureRecognizer* tapGesture = !! ! [[C2ToolbarTapGestureRecognizer alloc] initWithTarget:nil action:nil];!! tapGesture.dummyDelegate = self;!! tapGesture.delegate = self;!! [self.toolbar addGestureRecognizer:tapGesture];!}

カスタムのGestureRecognizerをUIToolbarにセット.

UINavigationControllerのサブクラスで

Page 22: UIToolbarの同時タッチを防ぐ

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {!! self.state = UIGestureRecognizerStatePossible;!! [self.dummyDelegate didBeginDummyTap:self];!}!!- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {!! self.state = UIGestureRecognizerStateFailed;!! [self.dummyDelegate didEndDummyTap:self];!}!!- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {!! self.state = UIGestureRecognizerStateFailed;!! [self.dummyDelegate didEndDummyTap:self];!}

タップのダウン・アップを検出し,UINav.に送る

Page 23: UIToolbarの同時タッチを防ぐ

この辺が妥協点か・・・・!コードも使い回せるし,汎用的だし,書き直しがないし!

!他にいい方法があったら教えてください.

Page 24: UIToolbarの同時タッチを防ぐ

まとめ

• 自己紹介

• 2tchのモジュール

• ツールバーとジェスチャの衝突を防ぎたい

Page 25: UIToolbarの同時タッチを防ぐ

Thank you.

@sonson_twit http://sonson.jp

Page 26: UIToolbarの同時タッチを防ぐ

backup slide

backup