3
votes

I have following view hierarchy:

UIView - root

-UICollectionView

-UIScrollView

BOTH are subviews of root view not of each other.

I want scrollview to only scroll vertically and collectionview to only scroll horizontally.

The problem I am having is getting the collection view to receive touches as it is underneath the scrollview.

Read other SO questions but was not able to find solution. Have tried overriding touches event methods in subclass of scroll view, but no luck.

2

2 Answers

1
votes

An easiest fix would be to,

1) add UICollectionView to the UIScrollView,

2) Pin UICollectionView's left, right, top, bottom to UIScrollView, and

3) Pin UIScrollView's left, right, top, bottom to it's parent `UIView', if it has got one!

This way, they will both automatically know who needs to respond to which scroll events depending upon their contents.

0
votes

Put an extra UIScrollView (1) above your existing UIScrollView (2) and UICollectionView (3), and set its delegate to an object that has references to (2) and (3) (e.g. your parent view or view controller). Implement the following method in that delegate:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView1
{
    _scrollView2.contentOffset = CGPointMake(0.0, scrollView1.contentOffset.y);
    _collectionView3.contentOffset = CGPointMake(scrollView1.contentOffset.x, 0.0);
}

(Don't forget to set _scrollView1.contentSize correctly.)