didSelectItemAtIndexPath of UICollectionView insid

2019-05-29 14:05发布

I've implemented non scrollable UICollectionView inside a UIscrollview. The size of the scrollview is 100x100 and that of collection view is 100x200; And the content size of the scroll view is 100x200.

My problem is, the didSelectItemAtIndexPath is not getting called when I touch some cells (the cells out of the 100x100 rect).

User interaction of the cells are enabled. All cells are touchable when I increment the scrollview height equal to the height of the collection view. Thanks in advance.

3条回答
男人必须洒脱
2楼-- · 2019-05-29 14:20

Swift 4.0

Register gesture in viewDidLoad function

  override func viewDidLoad() {
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapView(gesture:)))
        view.addGestureRecognizer(tapGesture)
    }

@objc func didTapView(gesture: UITapGestureRecognizer) {
    view.endEditing(true)
    let touchLocation:CGPoint = gesture.location(ofTouch: 0, in: self.collectionView)
    let indexPath = self.collectionView.indexPathForItem(at: touchLocation)
    if indexPath != nil {
        let cell = self.collectionView.cellForItem(at: indexPath!)
        if (cell?.isSelected)! {
            //PREFORM DESELECT
        } else {
            //PREFORM SELECT HERE
        }
    }
} 
查看更多
乱世女痞
3楼-- · 2019-05-29 14:31

My suggestion would be like this take a container whose size is same to collection view i.e 100x200 and add collection view on container and then add container on scroll view. This should fix this issue.

As i was having the similar issue as i was unable to scroll the collection view and select the collection view when making interaction on non visible part of scrollview.

查看更多
虎瘦雄心在
4楼-- · 2019-05-29 14:40

Because scrollView overlapped on Cell... Best way is add tap Gesture on UIScrollView such like,

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
[recognizer setNumberOfTapsRequired:1];
self.scrollViu.userInteractionEnabled = YES;
[self.scrollViu addGestureRecognizer:recognizer];

Add above code in cellForItemAtIndexPath method and Write gesture action method such like

-(void)gestureAction:(UITapGestureRecognizer *) sender
{
    CGPoint touchLocation = [sender locationOfTouch:0 inView:self.YourCollectionViewName];
    NSIndexPath *indexPath = [self.YourCollectionViewName indexPathForRowAtPoint:touchLocation];

    NSLog(@"%d", indexPath.item);
}

Here in above gesture (action) method you can get indexPath as same as didSelectItemAtIndexPath.

查看更多
登录 后发表回答