9

Có thể dịch tọa độ UICollectionViewCell's từ tương đối so với UICollectionView tương ứng với superview không? Cho đến nay tôi đã không thể dịch tọa độ UICollectionViewCell's khi chạm vào superview. Dưới đây là những gì tôi đã thử cho đến thời điểm này:Cách tìm tọa độ của UICollectionViewCell có liên quan đến Cửa sổ ứng dụng

- (void)collectionView:(UICollectionView *)collectionView 
     didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = 
    [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" 
               forIndexPath:indexPath]; 

    CGRect frame = CGRectMake(0.0, 
           0.0, 
           cell.frame.size.width, 
           cell.frame.size.height); 
    frame.origin = [cell convertPoint:cell.frame.origin 
           toView:self.view]; 
} 

Tôi muốn tạo khung mới bắt nguồn từ vị trí của ô trên chế độ xem, chứ không phải trong số UICollectionView. Bất kỳ trợ giúp sẽ là tuyệt vời, cảm ơn.

+0

kết quả gì các mã trên cung cấp cho bạn? Bạn đang làm gì với khung hình? – jrturton

+0

Khung kết quả cho tôi một nguồn gốc liên quan đến nguồn gốc của UICollectionView. Ví dụ, nếu một ô đã được chạm vào sau khi được cuộn 5000 điểm về bên trái, nguồn gốc khung hình sau khi chuyển đổi sẽ là {5000, 0}. –

+0

Sau khi tôi đã tính vị trí, tôi muốn chuyển tọa độ tới một chế độ xem phụ để hiển thị trên đầu ô được chạm. –

Trả lời

33

Câu trả lời này rất muộn, nhưng hy vọng nó sẽ giúp ai đó. Dan, bạn có ý tưởng đúng, nhưng nó thậm chí còn dễ dàng hơn những gì bạn có. Chỉ cần thay thế

CGRect frame = CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height); 
frame.origin = [cell convertPoint:cell.frame.origin toView:self.view]; 

với

CGRect frame = [collectionView convertRect:cell.frame toView:self.view]; 

Vấn đề là bạn đã gọi phương thức chuyển đổi trên các tế bào, không phải là collectionView.

+0

Sự hoàn hảo. Tôi đã nghiêm túc thử 50 thứ khác trước đó. Cảm ơn. #latenightprogramming –

+0

Hoàn hảo, cảm ơn! – revton

3

Nếu tôi hiểu chính xác, tôi nghĩ vấn đề là trước tiên bạn phải sửa cho chế độ xem contentOffset của chế độ xem cuộn, dễ thực hiện vì UICollectionView là lớp con của UIScrollView.

CGRect frame = CGRectMake(0.0, 
          0.0, 
          cell.frame.size.width, 
          cell.frame.size.height); 
CGPoint correctedOffset = 
CGPointMake(cell.frame.origin.x - collectionView.contentOffset.x, 
      cell.frame.origin.y - collectionView.contentOffset.y); 
frame.origin = [cell convertPoint:correctedOffset toView:self.view]; 

Tôi đã thử nghiệm ứng dụng này ở một trong các ứng dụng demo UICollectionView của mình và có vẻ như nó hoạt động. Hãy thử một lần.

1

Chỉ trong trường hợp nếu ai tìm kiếm này, đây là cách nó có thể được thực hiện trong Swift:

let cellFrameInSuperview = collectionView.convertRect(collectionView.cellForItemAtIndexPath(indexPath)!.frame, toView: view) 
Các vấn đề liên quan