8

Presets,mục biến mất kỳ lạ khi cuộn

tôi có collectionViewFlowLayout lớp con với

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 
    return YES; 
    } 

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect { 
    NSArray *arr = [super layoutAttributesForElementsInRect:rect]; 
    BBLog(@"ARRA:%@", arr); 
    for (UICollectionViewLayoutAttributes *attr in arr) { 
     if (CGAffineTransformIsIdentity(attr.transform)) { 
      attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 
     } 
    } 

    return arr; 
} 

CollectionView xoay để lộn ngược cuộn với

self.collectionView.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 

Nhưng ngay cả khi jus sử dụng collectionViewFlowLayout mẹ đẻ mà không subclassing, a git lỗi này

Sự cố

Tôi có hai tin nhắn và nhiều nội dung khác trong trò chuyện, nhưng khi cuộn ở dưới cùng (trên cùng bình thường) sẽ biến mất mục thứ hai.

layoutAttributesForElementsInRect cho trao rect trở lại hai thuộc tính cho hai indexPaths 0-0 và 0-1, nhưng phương pháp đại biểu

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

gọi là chỉ dành cho indexPath 0-0

Dưới đây hình ảnh

TopScroll enter image description here

CẬP NHẬT Vì vậy, tôi tìm thấy TẠI SAO nó xảy ra - điều này dòng mã

attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 

Look nếu remove chuyển

enter image description here

Trả lời

0

Xin lỗi, tất cả, nhưng tôi tìm thấy lý trí và làm việc xung quanh.

này chỉ xảy ra trên thiết bị không phải trên mô phỏng

Nhìn vào ba CGRects

iPhone 5S

(CGRect) oldFrame = (origin = (x = -0.000000000000056843418860808015, y = 0), size = (width = 320.00000000000006, height = 314.00000000000006)) 

iPhone 5C

(CGRect) oldFrame = (nguồn gốc = (x = 0, y = 0), kích thước = (chiều rộng = 320, chiều cao = 314))

Simulator Intel Core

(CGRect) oldFrame = (origin = (x = 0, y = 0), size = (width = 320, height = 314)) 

Để tất cả chúng tôi áp dụng luân chuyển qua

CGAffineTransformMakeRotation((CGFloat)M_PI) 

Đầu tiên đó là trên iPhone 5S ARM của Apple A7 CPU

Thứ hai đó là trên iPhone 5C ARM Apple A6 CPU

Thứ ba là trên Trình mô phỏng tại bộ xử lý Intel Core iX.

Vì vậy, công việc của tôi xung quanh là:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewLayoutAttributes *retAttr = [super layoutAttributesForItemAtIndexPath:indexPath]; 

    if (CGAffineTransformIsIdentity(retAttr.transform)) { 
     retAttr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 
    } 

    CGRect oldFrame = retAttr.frame; 

    oldFrame.origin.x = retAttr.frame.origin.x > 0 ?: 0; 

    retAttr.frame = oldFrame; 

    return retAttr; 
} 
+0

bất kỳ giải pháp nào cho việc nhanh chóng? – DeyaEldeen

+1

Trong nhanh chóng không kiểm tra, bây giờ mã hóa chỉ trong objc. Nhưng tôi nghĩ rằng cùng một vấn đề sẽ được. –

1

Tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ rằng, khi Bạn đang subclassing UICollectionViewFlowLayout, Bạn không được phép sửa đổi các thuộc tính trực tiếp, nhưng để thực hiện một sao chép các thuộc tính, thay đổi nó và trả lại nó.

giải thích sơ lược về tuyên bố đầu: Bạn sẽ phải phân lớp các UICollectionViewFlowDelegate (phụ huynh của UICollectionViewDelegateFlowLayout) và hơn làm cho các thuộc tính của riêng bạn và chỉnh sửa chúng như bạn muốn, nhưng điều này sẽ đòi hỏi của thực hiện rất nhiều logic tùy chỉnh hơn .

Ngoài ra, hãy xem liệu bạn có nhận được bất kỳ lỗi hoặc cảnh báo nào trong bảng điều khiển hay không.

Kiểm tra câu hỏi này: Warning: UICollectionViewFlowLayout has cached frame mismatch for index path 'abc'

Hy vọng rằng tôi đã có ít nhất một chút hữu ích.

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