UICollectionXem hoạt ảnh các mục sau khi reloadItemsAtIndexPaths được gọi (hoạt ảnh mờ dần).
Có cách nào để tránh hoạt ảnh này không?
hệ điều hanh 6
Câu trả lời:
Cần lưu ý rằng nếu bạn đang nhắm mục tiêu iOS 7 trở lên, bạn có thể sử dụng UIView
phương pháp mới performWithoutAnimation:
. Tôi nghi ngờ rằng điều này thực sự giống với các câu trả lời khác ở đây (tạm thời vô hiệu hóa UIView
hoạt ảnh / hành động Core Animation), nhưng cú pháp rất đẹp và rõ ràng.
Vì vậy, đối với câu hỏi này nói riêng ...
Mục tiêu-C:
[UIView performWithoutAnimation:^{
[self.collectionView reloadItemsAtIndexPaths:indexPaths];
}];
Nhanh:
UIView.performWithoutAnimation {
self.collectionView.reloadItemsAtIndexPaths(indexPaths)
}
Tất nhiên nguyên tắc này có thể được áp dụng cho bất kỳ trường hợp nào mà bạn muốn đảm bảo thay đổi không bị động .
Bạn cũng có thể thử điều này:
UICollectionView *collectionView;
...
[UIView setAnimationsEnabled:NO];
[collectionView performBatchUpdates:^{
[collectionView reloadItemsAtIndexPaths:indexPaths];
} completion:^(BOOL finished) {
[UIView setAnimationsEnabled:YES];
}];
Tôi cũng nhận thấy rằng nếu bạn bọc performBatchUpdates
trong một khối hoạt ảnh UIView, hoạt ảnh UIView được sử dụng thay vì hoạt ảnh mặc định, vì vậy bạn chỉ có thể đặt thời lượng hoạt ảnh thành 0, như sau:
[UIView animateWithDuration:0 animations:^{
[collectionView performBatchUpdates:^{
[collectionView reloadItemsAtIndexPaths:indexPaths];
} completion:nil];
}];
Điều này cực kỳ thú vị nếu bạn muốn sử dụng hình ảnh động mùa xuân của iOS 7 trong quá trình chèn và xóa!
performBatchUpdates
bên trong animateWithDuration
là tuyệt vời! Cảm ơn vì tiền hỗ trợ!
UICollectionXem hoạt ảnh các mục sau khi reloadItemsAtIndexPaths được gọi (hoạt ảnh mờ dần).
Có cách nào để tránh hoạt ảnh này không?
hệ điều hanh 6
Tôi giả sử bạn đang sử dụng FlowLayout. Vì bạn đang cố gắng loại bỏ hoạt ảnh mờ dần, hãy thử cách này:
import UIKit
class NoFadeFlowLayout: UICollectionViewFlowLayout {
override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attrs = super.initialLayoutAttributesForAppearingItem(at: itemIndexPath)
attrs?.alpha = 1.0
return attrs
}
override func finalLayoutAttributesForDisappearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attrs = super.finalLayoutAttributesForDisappearingItem(at: itemIndexPath)
attrs?.alpha = 1.0
return attrs
}
}
Đây là một câu hỏi rất cũ, vì vậy có thể bạn không nhắm mục tiêu iOS 6 nữa. Cá nhân tôi đang làm việc trên tvOS 11 và có cùng một câu hỏi, vì vậy đây là câu hỏi dành cho bất kỳ ai gặp phải vấn đề tương tự.
Tôi đã viết một danh mục trên UICollectionView để làm điều đó. Mẹo là vô hiệu hóa tất cả các hoạt ảnh trong khi tải lại:
if (!animated) {
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
}
[self reloadItemsAtIndexPaths:indexPaths];
if (!animated) {
[CATransaction commit];
}
CATransaction.setDisableActions(true)
viết tắt cho điều này.
extension UICollectionView {
func reloadWithoutAnimation(){
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
self.reloadData()
CATransaction.commit()
}
}
Đây là phiên bản Swift 3 performBatchUpdates
không có hoạt ảnh sang a UICollectionView
. Tôi thấy điều này hoạt động tốt hơn cho tôi collectionView.reloadData()
vì nó làm giảm sự hoán đổi ô khi các bản ghi được chèn vào.
func appendCollectionView(numberOfItems count: Int){
// calculate indexes for the items to be added
let firstIndex = dataItems.count - count
let lastIndex = dataItems.count - 1
var indexPaths = [IndexPath]()
for index in firstIndex...lastIndex {
let indexPath = IndexPath(item: index, section: 0)
indexPaths.append(indexPath)
}
UIView.performWithoutAnimation {
self.collectionView.performBatchUpdates({ () -> Void in
self.collectionView.insertItems(at: indexPaths)
}, completion: { (finished) -> Void in
})
}
}
- (void)reloadCollectionViewAnimated:(BOOL)animated {
if (animated) {
[self.collectionView performBatchUpdates:^{
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:^(BOOL finished) {
}];
} else {
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
[CATransaction commit];
}
}
Chỉ để thêm 0,02 đô la của mình, tôi đã thử cả hai phiên bản của câu trả lời đã chọn và cách ban đầu hoạt động tốt hơn cho mục đích của tôi. Tôi đang làm việc trên chế độ xem lịch cuộn vô hạn cho phép người dùng nhập lịch vào một tuần nhất định, sau đó vuốt qua lại và chọn các ngày riêng lẻ để lọc danh sách.
Trong cách triển khai của tôi, để giữ cho mọi thứ hoạt động hiệu quả trên các thiết bị cũ hơn, mảng ngày đại diện cho chế độ xem lịch phải được giữ tương đối nhỏ, có nghĩa là giữ khoảng 5 tuần giá trị ngày, với người dùng ở giữa ở tuần thứ 3. Vấn đề với việc sử dụng cách tiếp cận thứ hai là, có một bước thứ hai mà bạn phải cuộn chế độ xem bộ sưu tập trở lại giữa mà không có hoạt ảnh, điều này làm cho hình ảnh rất lởm chởm vì lý do nào đó với hoạt ảnh cơ sở bị chặn.
Mã của tôi:
[UIView setAnimationsEnabled:NO];
[self.collectionView performBatchUpdates:^{
[self.collectionView deleteItemsAtIndexPaths:indexPathDeleteArray];
[self.collectionView insertItemsAtIndexPaths:indexPathAddArray];
} completion:NULL];
[UIView setAnimationsEnabled:YES];
NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:14 inSection:0];
[self.collectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
func reloadRowsWithoutAnimation(at indexPaths: [IndexPath]) {
let contentOffset = collectionView.contentOffset
UIView.setAnimationsEnabled(false)
collectionView.performBatchUpdates {
collectionView.reloadItems(at: indexPaths)
}
UIView.setAnimationsEnabled(true)
collectionView.setContentOffset(contentOffset, animated: false)
}