2012-09-24 44 views
6

Chúng tôi đang cố gắng thiết lập UICollectionView với bố cục tùy chỉnh. Nội dung của mỗi CollectionViewCell sẽ là một hình ảnh. Trên tất cả sẽ có hàng nghìn hình ảnh và khoảng 140-150 hiển thị tại một thời điểm nhất định. Trên một sự kiện hành động có khả năng tất cả các ô sẽ được tổ chức lại ở vị trí và kích thước. Mục tiêu là tạo hiệu ứng cho tất cả các sự kiện đang chuyển động hiện đang sử dụng phương thức performBatchUpdates. Điều này gây ra một thời gian trễ rất lớn trước khi tất cả mọi thứ được hoạt hình.Các vấn đề về hiệu suất UICollectionView trên performBatchUpdates

Điều này đến nay chúng tôi phát hiện ra rằng nội bộ phương pháp bố tríAttributesForItemAtIndexPath được gọi cho mỗi tế bào đơn lẻ (vài nghìn trong tổng số). Ngoài ra, phương thức cellForItemAtIndexPath được gọi cho nhiều ô hơn là thực tế có thể được hiển thị trên màn hình.

Có khả năng nào để nâng cao hiệu suất hoạt ảnh không?


UICollectionViewFlowLayout mặc định không thể cung cấp loại thiết kế mà chúng tôi muốn nhận ra trong ứng dụng. Dưới đây là một số mã của chúng tôi:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
RPDataModel *dm = [RPDataModel sharedInstance]; //Singleton holding some global information 
NSArray *plistArray = dm.plistArray; //Array containing the contents of the cells 
NSDictionary *dic = plistArray[[indexPath item]]; 
RPCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CELL" forIndexPath:indexPath]; 
cell.label.text = [NSString stringWithFormat:@"%@",dic[@"name"]]; 
cell.layer.borderColor = nil; 
cell.layer.borderWidth = 0.0f; 
[cell loadAndSetImageInBackgroundWithLocalFilePath:dic[@"path"]]; //custom method realizing asynchronous loading of the image inside of each cell 
return cell; 
} 

Các lặp layoutAttributesForElementsInRect khắp các yếu tố thiết layoutAttributes cho allthe yếu tố bên trong rect. Cho-tuyên bố phá vỡ vào ô đầu tiên là qua biên giới được xác định bởi góc dưới bên phải của rect:

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect { 
NSMutableArray* attributes = [NSMutableArray array]; 
RPDataModel *dm = [RPDataModel sharedInstance]; 
for (int i = 0; i < dm.cellCount; i++) { 
    CGRect cellRect = [self.rp getCell:i]; //self.rp = custom object offering methods to get information about cells; the getCell method returns the rect of a single cell 
    if (CGRectIntersectsRect(rect, cellRect)) { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[dm.relevanceArray[i][@"product"] intValue] inSection:0]; 
     UICollectionViewLayoutAttributes *attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
     attribute.size = cellRect.size; 
     attribute.center = CGPointMake(cellRect.origin.x + attribute.size.width/2, cellRect.origin.y + attribute.size.height/2); 
     [attributes addObject:attribute]; 
    } else if (cellRect.origin.x > rect.origin.x + rect.size.width && cellRect.origin.y > rect.origin.y + rect.size.height) { 
     break; 
    } 
} 
return attributes; 
} 

Mở Layout thay đổi kết quả là khá nhiều như nhau bất kể nếu số lượng tế bào được xác định trong layoutAttributesForElementsInRect bị giới hạn hoặc không .. Hoặc hệ thống nhận các thuộc tính layout cho tất cả các ô trong đó nếu nó không bị giới hạn hoặc nó gọi phương thức layoutAttributesForElementAtIndexPath cho tất cả các ô bị thiếu nếu nó bị giới hạn. Nhìn chung, các thuộc tính cho mỗi ô đơn lẻ đang được sử dụng bằng cách nào đó.

-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { 
RPDataModel *dm = [RPDataModel sharedInstance]; 
UICollectionViewLayoutAttributes *attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
CGRect cellRect = [self.rp getCell:[dm.indexDictionary[@(indexPath.item)] intValue]]; 
attribute.size = cellRect.size; 
attribute.center = CGPointMake(cellRect.origin.x + attribute.size.width/2, cellRect.origin.y + attribute.size.height/2); 
return attribute; 
}  
+0

Vui lòng đăng mã của bạn từ UICollectionViewLayout của bạn. –

Trả lời

3

Nếu không nhìn thấy mã, tôi đoán là phương pháp layoutAttributesForElementsInRect của bạn được lặp qua tất cả các mặt hàng trong bộ sưu tập của bạn, và đó là, đến lượt nó, những gì đang gây ra các phương pháp khác để có được quá gọi. layoutAttributesForElementsInRect cho bạn một gợi ý - tức là, CGRect nó chuyển cho bạn - về những mục bạn cần gọi layoutAttributesForItemAtIndexPath cho, về mặt gì trên màn hình.

Vì vậy, đó có thể là một phần của vấn đề hiệu suất - tức là, điều chỉnh bố cục tùy chỉnh của bạn để thông minh về những mục đang cập nhật.

Các vấn đề khác liên quan đến hiệu suất hoạt ảnh nói chung. Một điều cần lưu ý là nếu có bất kỳ loại ghép nào đang diễn ra - hãy đảm bảo hình ảnh của bạn mờ đục. Một điều nữa là nếu bạn đang sử dụng bóng trên hình ảnh của bạn, những thứ đó có thể tốn kém để tạo hiệu ứng động. Một cách để cải thiện hiệu suất hoạt ảnh của bóng tối được đặt giá trị shadowPath khi hình ảnh được thay đổi kích thước - nếu bạn có bóng, hãy cho tôi biết và đăng một số mã để thực hiện điều đó.

+0

Chúng tôi đã chỉ lặp qua tất cả các yếu tố bên trong của rect cho layoutAttributesForElementsInRect. Hệ thống vẫn gọi phương thức layoutAttributesForItemAtIndexPath cho tất cả các ô bên ngoài rect.Trong trường hợp hình ảnh, chúng tôi không sử dụng bất kỳ bóng tối nào và chúng đã mờ đục. Một vấn đề có thể là số lần xem được hiển thị tại một thời điểm (khoảng 140). –

+0

Sẽ rất hữu ích nếu bạn đăng mã. Một gợi ý, cho các mục đích gỡ lỗi thực hiện cùng một khung nhìn bộ sưu tập bằng cách sử dụng UICollectionViewFlowLayout dựng sẵn và cung cấp cho nó các tham số tương tự như những gì bạn đang sử dụng trong chế độ xem tùy chỉnh của mình. Các sự kiện kích hoạt gây ra UICollectionViewFlowLayout để tổ chức lại một cách đáng kể và xem các hoạt ảnh có tốt hơn không. –

+0

FYI, Apple cuối cùng đã đăng một dự án mã mẫu cho CollectionViews. Thật không may, đó là một thực hiện đơn giản nhất - không có bố trí tùy chỉnh, đó là mã tôi thực sự cần phải xem. –

0

Điều này có vẻ là do cố gắng thêm ô vào các phần có chế độ xem tiêu đề nhưng không có ô nào trong đó.

Thông báo lỗi không hữu ích về mặt tài chính và mất vài giờ để theo dõi nó.

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