【Objective-C】xib上で新規追加したUIScrollViewが邪魔して親Viewのタップイベントを取得できない場合の対処法(カスタムクラスの作り方)【Xcode10.2対応】

こういう人に向けて発信しています。
・xibの親Viewがタップイベントを取れなくなった人
・カスタムクラスを作りたい人
・Objective-C中級者

そもそもViewのタップイベントの取得方法とは?

#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
   [super viewDidLoad];
}

//これだけ新規追加
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   //タッチした時の処理
   NSLog(@"タッチした時の処理");
}

@end

通常のviewControllerに上記メソッドを追加してあげるだけで
タップされた時に通知が来るので、ここに処理を書きましょう。

xibの親Viewの上にScrollViewなどを乗っけた場合に起こる問題

上記タップイベントのメソッドで取得できなくなるようになります。
解決方法として紹介するのは下記の通りです。
・タップイベントを返すカスタムScrollViewクラスを作る
 →カスタムクラスを作成する。

カスタムクラスの作り方

(1)Command+Nで「クラスを追加する」

(2)UIScrollViewを指定してクラスを追加

(3)Custom.h/mにこのように記述する。
※コピペでOKです。

//CustomScrollView.h
#import <UIKit/UIKit.h>
@interface CustomScrollView : UIScrollView
@end

//CustomScrollView.m
#import "CustomScrollView.h"
@implementation CustomScrollView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   //タッチした時の処理
   NSLog(@"タッチした時の処理");
   [[self nextResponder] touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
   //タッチしたまま移動させた時の処理
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
   //タッチを終えた時の処理
}

@end

(4)Xib上で追加したScrollViewをクリックしてカスタムクラスを指定


この記事が気に入ったらサポートをしてみませんか?