Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UIToolbarの同時タッチを防ぐ

7,856 views

Published on

Published in: Technology, Art & Photos
  • Hello there! Get Your Professional Job-Winning Resume Here! http://bit.ly/topresum
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

UIToolbarの同時タッチを防ぐ

  1. 1. potatotips UIToolbarの同時タッチを防ぐ デンソーアイティーラボラトリ @sonson_twit 吉田悠一
  2. 2. 本業
  3. 3. 自己紹介
  4. 4. sonsongithubで検索
  5. 5. 2tchのモジュールをOSSに • UZMultipleLayeredPopoverController • UZTextView • UZInputCandidateAccessory
  6. 6. コードの保守性を高めるために • モジュールを切り出して公開する
  7. 7. 本日のお題 @sonson_twit http://sonson.jp
  8. 8. まずはこの症状をご覧ください
  9. 9. 問題点 • 同時入力できてしまう • ツールバーのボタン • UINav.Con.のジェスチャ ! • UIViewControllerの階層構造が壊れる • MobileSafariはロックして回避しているようだ
  10. 10. 対策案 • UIBarButtonItemに対策を施す • exclusiveTouch? • UIBarButtonItemからdownとupを奪う
  11. 11. exclusiveTouch • 役立たず • だが,ツールバー上のボタン二つ同時押しは 避けることができた
  12. 12. /**! * UIToolbarでボタンふたつの同時押しを防止する.! **/! - (void)setExclusiveForUIBarButtonsOnToolbar {! ! for (UIView* view in [self.navigationController.toolbar subviews]) {! ! ! view.exclusiveTouch=YES;! ! }! } これもグレーといえば,グレー
  13. 13. UIBarButtonItemのイベント • タップイベントの横取りが直接できない • C2ToolbarButton - undocumented class • viewからswizzlingでタップイベントを奪う • customにしてUIButtonを内蔵する • UIToolbarにジェスチャをつける
  14. 14. Undocumented API • ダメですわ・・・・
  15. 15. Swizzling • え・・・そんなんやりたくないです • 昔,リジェクトされたし・・・・
  16. 16. UIButton in UIBarButtonItem • え・・・汎用性なくなりますよ • Storyboardのボタンを全部作り替えるとか • 難のためにそんなアホなことを • 嫌です
  17. 17. /**! * 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とか使えないですやん
  18. 18. UIToolbarにジェスチャ • UIGestureRecognizerのサブクラスを実装 • touchesBegin • touchesCancelled, touchesEnded • ジェスチャは失敗させる • UINavigationControllerにコールバック • interactiveGestureRecognizer.enable
  19. 19. - (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のサブクラスで
  20. 20. - (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.に送る
  21. 21. この辺が妥協点か・・・・! コードも使い回せるし,汎用的だし,書き直しがないし! ! 他にいい方法があったら教えてください.
  22. 22. まとめ • 自己紹介 • 2tchのモジュール • ツールバーとジェスチャの衝突を防ぎたい
  23. 23. Thank you. @sonson_twit http://sonson.jp
  24. 24. backup slide backup

×