2013-05-06 32 views
7

Tôi có một Ứng dụng iPad nơi tôi đang sử dụng UICollectionView và mỗi UICollectionViewCell chỉ chứa một UIImage duy nhất. Hiện tại tôi đang hiển thị trên 9 UIImages (3 hàng * 3 cột) trên mỗi trang, tôi có một vài trang.phóng to toàn bộ UICollectionView

Tôi muốn sử dụng Cử chỉ chụm để thu phóng trên toàn bộ UICollectionView để tăng/giảm số hàng/cột được hiển thị trên mỗi trang và tốt nhất là có hoạt ảnh thu phóng đẹp trong cử chỉ Pinch!

Hiện tại, tôi đã thêm Cử chỉ Ghim vào UICollectionView của mình. Tôi bắt sự kiện Pinch cử chỉ để tính toán số hàng/cột bằng cách sử dụng yếu tố quy mô, nếu nó đã thay đổi sau đó tôi cập nhật đầy đủ các UICollectionView sử dụng:

[_theCollectionView performBatchUpdates:^{ 
    [_theCollectionView deleteSections:[NSIndexSet indexSetWithIndex:0]]; 
    [_theCollectionView insertSections:[NSIndexSet indexSetWithIndex:0]]; 
} completion:nil]; 

Nó hoạt động nhưng tôi không có hình ảnh động trơn tru trong suốt chuyển đổi.

Bất kỳ ý tưởng nào? UICollectionView kế thừa từ UIScrollView, có khả năng tái sử dụng tính năng cử chỉ UIScrollView Pinch để đạt được mục tiêu của tôi không?

Trả lời

0

Xin lỗi cho câu hỏi 2 xu của tôi, tôi đã tìm thấy giải pháp, rất đơn giản.

Trong PinchGesture callback của tôi Tôi vừa thực hiện như sau:

void (^animateChangeWidth)() = ^() { 
    _theFlowLayout.itemSize = cellSize; 
}; 

[UIView transitionWithView:self.theCollectionView 
        duration:0.1f 
        options:UIViewAnimationOptionCurveLinear 
       animations:animateChangeWidth 
       completion:nil]; 

Tất cả các tế bào của UICollectionView của tôi được thay đổi thành công và với một tốt đẹp transition.

+4

Đó không phải là cách thích hợp để xử lý mở rộng quy mô, bạn về cơ bản buộc vẽ lại toàn bộ collectionView, khi tính năng đó đã được hỗ trợ bởi tính hợp lệ bố cục '[collectionView.collectionViewLayout invalidateLayout]'. Tôi để lại một câu trả lời với một lời giải thích và ví dụ kỹ lưỡng hơn. – Can

+0

Xin vui lòng, bạn có thể thêm chi tiết về điều này? – sebastien

25

Tôi giả sử bạn đang sử dụng UICollectionViewDelegateFlowLayout mặc định, đúng không? Sau đó, hãy chắc chắn rằng bạn trả lời cho phù hợp với các phương pháp đại biểu, và khi cử chỉ pinch xảy ra, chỉ cần vô hiệu hóa bố trí.

Ví dụ, nếu tôi muốn điều chỉnh kích thước của tất cả các mục, trong khi véo:

@interface ViewController() <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> 

@property (nonatomic,assign) CGFloat scale; 
@property (nonatomic,weak) IBOutlet UICollectionView *collectionView; 

@end 

@implementation ViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.scale = 1.0; 

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; 

    UIPinchGestureRecognizer *gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(didReceivePinchGesture:)]; 
    [self.collectionView addGestureRecognizer:gesture]; 

} 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake(50*self.scale, 50*self.scale); 
} 

- (void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture 
{ 
    static CGFloat scaleStart; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     scaleStart = self.scale; 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     self.scale = scaleStart * gesture.scale; 
     [self.collectionView.collectionViewLayout invalidateLayout]; 
    } 
} 

Thuộc tính self.scale là chỉ dành riêng cho chương trình, bạn có thể áp dụng khái niệm này cùng với bất kỳ thuộc tính khác, điều này doesn' t yêu cầu beginUpdates/endUpdates vì ​​chính người dùng đó đang mang thời gian của thang đo.

Here's a running project, trong trường hợp bạn muốn xem nó hoạt động.

+0

+1 Cảm ơn! Kiểm tra bản demo của bạn và nó thực sự hữu ích. Bạn có thể hướng dẫn cách chúng ta có thể hiển thị các chuyển tiếp này với một hoạt ảnh đẹp ... Tôi là một người mới đến UICollectionView. – Yogi

+1

Câu trả lời tuyệt vời, tò mò nếu bạn có bất kỳ thông tin chi tiết nào về việc cần làm nếu bố cục được 'cố định' hơn và bạn muốn phóng to/thu nhỏ và xoay quanh (không di chuyển các mục). Hãy suy nghĩ của một bản đồ ví dụ với các mục trên bản đồ là UICollectionCells và gạch có khả năng được tái sử dụng xem xét hoặc tương tự. – MobileVet

+1

@MobileVet Đối với luận án của tôi, tôi đã viết một UICollectionViewLayout tùy chỉnh tạo ra một cái gì đó giống như một bản đồ, và nó hoàn toàn có thể. Nếu bạn thực hiện kích thước nội dung mà bố cục xem bộ sưu tập báo cáo lớn hơn với một yếu tố tỷ lệ, thì bạn có thể có cả phóng to và thu phóng. – Can