2013-06-06 43 views
19

Tôi đang cố thêm một số UIScrollView vào trong một số UICollectionViewCell. Ý tưởng là bạn có thể sử dụng pinch để phóng to UIScrollView (và với nó, hình ảnh bên trong), nhưng scrollview dường như không xử lý bất kỳ cử chỉ nào. Tôi đoán họ đang bị bắt bởi số UICollectionView.Cách phóng to UIScrollView bên trong UICollectionViewCell?

Tôi đã đặt đại biểu của UIScrollView thành UICollectionViewCell, nhưng không có phương thức đại biểu nào được gọi.

EDIT: Tôi đã tạo một repo github với mã (đơn giản càng nhiều càng tốt). Mặc dù nó chỉ là một vài dòng mã, tôi không thể nhìn thấy những gì tôi đã làm sai.

EDIT2: Sau câu trả lời đã được tìm thấy, tôi đã thêm các bản sửa lỗi cho repo nói trên, hy vọng những người khác tìm thấy nó hữu ích quá :)

https://github.com/krummler/gallery-pinchzoom-example

+1

Cám ơn đã đưa mã cập nhật vào một repo. Nó rất hữu ích cho tôi! – super9

Trả lời

23

Bạn có thể muốn thử thao tác UIGestureRecognizers để làm điều đó. Trong GalleryViewController:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
        cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    GalleryImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"galleryImageCell" forIndexPath:indexPath]; 

    ImageContext *imageContext = [self.images objectAtIndex:indexPath.row]; 

    cell.imageContext = imageContext; 
    [self.collectionView addGestureRecognizer:cell.scrollView.pinchGestureRecognizer]; 
    [self.collectionView addGestureRecognizer:cell.scrollView.panGestureRecognizer]; 

    return cell; 
} 

Từ Apple's documentation on UIView:

Gắn một trình nhận dạng cử chỉ để một cái nhìn xác định phạm vi cử chỉ thể hiện, làm cho nó nhận được chạm lần truy cập thử nghiệm để xem điều đó và tất cả của nó các cuộc phỏng vấn. Chế độ xem giữ lại trình nhận dạng cử chỉ.

Vì vậy, bạn cũng sẽ muốn đảm bảo xóa chúng khi ô không hiển thị nữa.

- (void)collectionView:(UICollectionView *)collectionView 
    didEndDisplayingCell:(UICollectionViewCell *)cell 
    forItemAtIndexPath:(NSIndexPath *)indexPath { 

    // Get the cell instance and ... 
    [self.collectionView removeGestureRecognizer:cell.scrollView.pinchGestureRecognizer]; 
    [self.collectionView removeGestureRecognizer:cell.scrollView.panGestureRecognizer]; 
} 

Vì bạn không sửa đổi đại biểu của UIGestureRecognizer, chỉ phạm vi của nó, nó sẽ vẫn kiểm soát việc thu phóng chỉ cuộn của ô đó.

EDIT:

tôi thêm panGestureRecognizer các ví dụ ở trên, sau đây là một gợi ý từ OP rằng nó là cần thiết. Bản thân việc thu phóng được xử lý hoàn toàn bởi pinchGestureRecognizer, nhưng trong hầu hết các trường hợp, sau khi phóng to hình ảnh đến điểm chỉ hiển thị một tập hợp con, bạn sẽ muốn di chuyển phần có thể nhìn thấy xung quanh. Đó là, đó là một phần của trải nghiệm thu phóng thích hợp.

+0

Tuyệt vời! Tôi đã phải làm điều tương tự cho 'panGestureRecognizer' và tôi đã tốt để đi! Cảm ơn :) (không thể giải thưởng tiền thưởng được nêu ra vì lý do nào đó, tôi sẽ làm điều đó sau.) –

+0

@matehat Im sử dụng nhanh chóng, và didEndDisplaying tế bào của tôi, tôi tiếp tục nhận được một 'tìm thấy nil unwrapping tùy chọn' lỗi. Tôi đã thử làm cho nó 'nếu để', nó không bao giờ được gọi. :/Đây là cách tôi nhận được ví dụ: let cell = collectionView.cellForItemAtIndexPath (indexPath) as! FSImageCell –

+0

tôi không cần thêm/xóa trình gesturerecognizers vào ô. Cả hai pinching và panning đã làm việc cho tôi trong các tế bào trong khi vẫn cho phép tôi di chuyển theo chiều ngang thông qua collectionview của tôi. Tôi đã sử dụng các ô toàn màn hình cho một thư viện hình ảnh. – thgc

0

Kiểm tra xem tất cả các quan điểm liên quan của cảm ứng đa điểm trên. iOS đa cảm ứng bị vô hiệu hóa theo mặc định trên hầu hết các chế độ xem để tiết kiệm năng lượng.

+0

Tôi đã thử điều đó và cố gắng bắt chước một số ví dụ mà tôi có thể tìm thấy, tôi vẫn không thể làm cho nó hoạt động. Tôi đã thêm một url repo github vào bài gốc –

0
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{    
    if (touch.view == [self myScrollView]) //<- whatever your scrollView is called 
    { 
     return YES; 
    } 
    return NO; 
} 

Không biết mã của bạn nhưng hãy thử chơi xung quanh với mã ở trên để xem bạn có thể lọc chạm vào các đối tượng bạn muốn không. Mã trên là từ .

+0

Cảm ơn, tôi đã thêm nó vào collectionviewcell, nó dường như không được gọi cho scrollview trong đó, chỉ cho khung nhìn bên ngoài. –

0

Các đại biểu không nhận được cuộc gọi vì bạn đã thêm nó vào trong UICollectionview.Các sự kiện cảm ứng có sẵn cho chế độ xem bộ sưu tập là chế độ giám sát và do đó không thể xem được bên trong.Bạn có thể phải nghĩ ra một số cách khác để đạt được mô hình này.

UICollectionView là có cùng một khuôn mẫu như UITableView, Vấn đề occours trong tableview bên scrollview, rằng sự kiện liên lạc được chấp nhận bởi scrollview [là SuperView] và để làm cho tableview cuộn trong trường hợp đó, The cuộn của scrollview phải được vô hiệu hóa.Đây là một phiên bản khác của vấn đề đó

Tài liệu táo nói rằng trường hợp trên cho kết quả không thể đoán trước. Điều này có thể tương tự cho vấn đề của bạn.

Theo tôi bạn phải đi cho thiết kế tốt hơn có thể đạt được những gì bạn tìm kiếm

2

Vui lòng thêm scrollview trong di động của bạn và xem hình ảnh di động hiện tại của bạn thêm trong scrollview. sau đó sử dụng mã dưới đây:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ImageContext *context = [self.images objectAtIndex:indexPath.row]; 
    ImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"imageCell" forIndexPath:indexPath]; 
    cell.cellScrollView.autoresizesSubviews = YES; 
    cell.cellScrollView.multipleTouchEnabled =YES; 
    cell.cellScrollView.maximumZoomScale = 4.0; 
    cell.cellScrollView.minimumZoomScale = 1.0; 
    cell.cellScrollView.clipsToBounds = YES; 
    cell.cellScrollView.delegate = self; 
    cell.cellScrollView.zoomScale = 1.0; 

    [cell.imageView setImage:[UIImage imageNamed:context.thumbImageUrl]]; 

return cell; 
} 
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ NSLog(@"%i",scrollView.subviews.count); 
    for (UIView *v in scrollView.subviews) { 
    if ([v isKindOfClass:[UIImageView class]]) { 
     return v; 
     } 
    } 

}

15

Tôi chỉ cần thực hiện một thực hiện cho SWIFT 3 trên iOS 9.3+ và tất cả tôi làm là:

1. Đặt xem hình ảnh bên trong một scrollview

storyboard example

2. Kết nối đại biểu scrollview với lớp xem thu thập di động

3. Triển khai mã dưới đây vào lớp con collectionview

class FullScreenImageTextDetailCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate { 

    @IBOutlet var scrollview: UIScrollView! 
    @IBOutlet weak var backgroundImageView: UIImageView! 

    override func awakeFromNib() { 
     self.scrollview.minimumZoomScale = 0.5 
     self.scrollview.maximumZoomScale = 3.5 
     self.scrollview.delegate = self 
    } 

    func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
     return self.backgroundImageView 
    } 
} 

Không cử chỉ recognizer thêm hoặc loại bỏ trên bộ điều khiển collectionview mẹ là cần thiết, làm việc như một nét duyên dáng!

Cảm ơn các ví dụ trước đây về việc này!

+0

Câu trả lời hay. Đặt viewForZooming delegate callback trong lớp cell là khóa. –

+0

cảm ơn @ alku83! – mourodrigo

+0

nhờ nó hoạt động cho tôi –

0
I've set the delegate of the UIScrollView to be the UICollectionViewCell, but none of the delegate methods are being called. 

Cho rằng chỉ xác định một chức năng trong collectionViewCell

@IBOutlet weak var mainScrollView:UIScrollView! 
    func setup(){ 
     mainScrollView.minimumZoomScale=1 
     mainScrollView.maximumZoomScale=10.0 

     mainScrollView.delegate=self 

    } 

    func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
     return yourimageviewinside of scrollview 
    } 

gọi fuction này trong collectionview(_,cellForItem) phương pháp collectionview

Các vấn đề liên quan