화면 주위로 끌어서 놓을 수있는 요소가있는 UICollectionView가 있습니다. UILongPressGestureRecognizer를 사용하여 드래그를 처리합니다. 이 인식기를 내 collectionView:cellForItemAtIndexPath:
메서드 의 컬렉션 뷰 셀에 연결합니다 . 그러나, 인식의 뷰 속성은 때때로 반환 UIView
대신의 UICollectionViewCell
. UICollectionViewCell에만있는 일부 메서드 / 속성이 필요하며 대신 UIView가 반환 될 때 내 앱이 충돌합니다.
셀에 연결된 인식기가 일반 UIView를 반환하는 이유는 무엇입니까?
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
EXSupplyCollectionViewCell *cell = (EXSupplyCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:cell action:nil];
longPressRecognizer.delegate = self;
[cell addGestureRecognizer:longPressRecognizer];
return cell;
}
저는 switch 문과 함께 메서드를 사용하여 길게 누름의 여러 상태를 전달합니다.
- (void)longGestureAction:(UILongPressGestureRecognizer *)gesture {
UICollectionViewCell *cell = (UICollectionViewCell *)[gesture view];
switch ([gesture state]) {
case UIGestureRecognizerStateBegan:
[self longGestureActionBeganOn:cell withGesture:gesture];
break;
//snip
default:
break;
}
}
때 longGestureActionBeganOn:withGesture
경우라고 cell
실제로 UICollectionViewCell
완벽하게 동작이 실행의 나머지 부분은. 그렇지 않은 경우 셀이 될 인덱스 경로를 결정하려고 할 때 중단됩니다.
- (void)longGestureActionBeganOn:(UICollectionViewCell *)cell withGesture:(UILongPressGestureRecognizer *)gesture
{
NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell]; // unrecognized selector is sent to the cell here if it is a UIView
[self.collectionView setScrollEnabled:NO];
if (indexPath != nil) {
// snip
}
}
또한 제스처의 다른 상태에 대해 UICollectionViewCell과 관련된 다른 속성을 사용합니다. 인식기가 내가 할당 한보기를 항상 돌려 주도록 보장 할 수있는 방법이 있습니까?
UICollectionView 및 UITableView와 같은 뷰는 셀을 재사용합니다. 맹목적으로 gestureRecognizer를 collectionView:cellForItemAtIndexPath:
추가하면 셀이 다시로드 될 때마다 새 인식 자를 추가합니다. 약간 스크롤하면 각 셀에 수십 개의 gestureRecognizer가 표시됩니다.
이론적으로 이것은 gestureRecognizer의 동작이 여러 번 호출된다는 것 외에는 어떤 문제도 일으키지 않아야합니다. 그러나 Apple은 셀 재사용에 대해 강력한 성능 최적화를 사용하므로 무언가가 엉망이 될 수 있습니다.
문제를 해결하는 가장 좋은 방법은 대신에 gestureRecognizer를 collectionView 에 추가하는 것입니다.
또 다른 방법은 셀에 gestureRecognizer가 이미 있는지 확인하고없는 경우에만 새 인식자를 추가하는 것입니다. 또는 찾은 솔루션을 사용 prepareForReuse
하고 셀 에서 gestureRecognizer를 제거합니다 . 후자의 방법을 사용할 때 올바른 방법을 제거 (또는 테스트)했는지 확인해야합니다. 시스템에서 추가 한 gestureRecognizers를 제거하고 싶지 않습니다. (iOS가 현재 이것을 사용하고 있는지 확실하지 않지만 향후 앱을 증명하려면이 모범 사례를 고수하는 것이 좋습니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다