そのため、ViewController 全体を満たすスクロールビュー内に 2 つのスクロールビューを取得しました。
最初の SV は問題なくスクロールしているため、2 つのサブ SV の contentSize が設定されます。
残念ながら、それは Autolayout で何かする必要があると思います...オンになっていて、オフにすると、1.SV はスクロールしませんが、サブ SV がスクロールします。
それを解決する方法はありますか?
そのため、ViewController 全体を満たすスクロールビュー内に 2 つのスクロールビューを取得しました。
最初の SV は問題なくスクロールしているため、2 つのサブ SV の contentSize が設定されます。
残念ながら、それは Autolayout で何かする必要があると思います...オンになっていて、オフにすると、1.SV はスクロールしませんが、サブ SV がスクロールします。
それを解決する方法はありますか?
hitTest:withEvent:
カスタムScrollView
サブクラスでオーバーライドしてみてください。次のコードは、内部の UIScollView がすべてのタッチを処理するようにする必要があります。
@interface MyCustomScrollView : UIScrollView
@end
@implementation MyCustomScrollView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView* handler = nil;
if ([self pointInside:point withEvent:event]) {
for (UIView* view in self.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
CGPoint subPoint = [self convertPoint:point toView:view];
handler = [view hitTest:subPoint withEvent:event];
if (handler) {
break;
}
}
}
if (nil == handler) {
handler = [super hitTest:point withEvent:event];
}
}
return handler;
}
@end
注: スクロール可能な領域内にスクロール可能なサブ領域があると、ユーザー エクスペリエンスが低下します。コンテンツに合わせて内部スクロール ビューのサイズを変更することを検討してください。
通常、スクロールビューはすべてのタッチイベントを食べます。したがって、スクロールビューのサブビューはタッチ イベントを取得しません。サブビューでタッチ イベントを有効にするには、タッチ イベントをスクロール ビューから次のレスポンダーに渡すことができます。
scrollview サブクラスで touches メソッドをオーバーライドすることで、これを行うことができます。例を含む詳細な説明は、こちらにあります。