UIScrollViewからそのスーパービューにタッチを転送する方法を理解しようとしています。その理由は、ある種のカーソルがタッチに追従するためです。とにかく、スクロールビューにはUIButtonが表示されます。タッチを転送するための私のコードは、scrollviewサブクラスで委任を使用することです。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateBegan:)]) {
[[self tfDelegate]tfDelegateBegan:[touches anyObject]];
}
NSLog(@"touches began");
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesMoved:touches withEvent:event];
if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateMoved:)]) {
[[self tfDelegate]tfDelegateMoved:[touches anyObject]];
}
NSLog(@"touches moved");
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesEnded:touches withEvent:event];
if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateEnded:)]) {
[[self tfDelegate]tfDelegateEnded:[touches anyObject]];
}
NSLog(@"touches ended");
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesCancelled:touches withEvent:event];
if ([[self tfDelegate]respondsToSelector:@selector(tfDelegateCancelled:)]) {
[[self tfDelegate]tfDelegateCancelled:[touches anyObject]];
}
NSLog(@"touches cancelled");
}
ただし、UIScrollviewsはUIGestureRecognizersを介して動作することを学びました。そのため、これらのメソッドはデフォルトでは呼び出されません。ジェスチャレコグナイザーはiOS5で公開されていることを認識していますが、4.0もサポートする必要があります。私は代わりにこれをしました:
NSArray *a = [[theScrollview gestureRecognizers]retain];
for (UIGestureRecognizer *rec in a) {
if ([rec isKindOfClass:[UIPanGestureRecognizer class]]) {
NSLog(@"this is the pan gesture");
rec.cancelsTouchesInView = NO;
}
}
これにより、ジェスチャが機能し、touchsメソッドを同時に呼び出すことができます。問題は、ボタンに触れながらスクロールしようとすると、スクロール中にボタンが押される可能性があることです。通常、スクロールはボタンをキャンセルし、ボタンを押すことができるのは、scrollviewがスクロールしていない場合のみです。これが望ましい機能です。これをどのように達成するかについての提案はありますか?