mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-10 14:35:42 +00:00
* Minor refactors in ASCollectionView and its private cell classes - `_ASCollectionReusableView` and `_ASCollectionViewCell` no longer expose getters for their collection element and cell node properties. This is to make sure that clients can only obtain elements from the visible map which is always the source of truth. - Since the map can return `nil` for an element request, it's much safer to check and avoid adding/removing a nil pointer to an `NSArray`. - Since we use a special way to check whether an object of kind of `_ASCollectionViewCell` or `_ASCollectionReusableView`, based on the assumption that these classes are subclass restricted, I added cast-or-return macros in the header files, closer to where the restrictions are declared. * Add ASDynamicCastStrict * Add element and node properties back to _ASCollectionReusableView and _ASCollectionViewCell * Assert unexpected nil elements * Always mark an element visible even if it is backed by an UIKit / non-_ASCollection* view * Fix typo * Remove unnecessary changes * Dump mistakes * Update CHANGELOG * Can't track visibility of elements backed by non-_AS views
97 lines
2.6 KiB
Objective-C
97 lines
2.6 KiB
Objective-C
//
|
||
// _ASCollectionReusableView.m
|
||
// Texture
|
||
//
|
||
// Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
|
||
// This source code is licensed under the BSD-style license found in the
|
||
// LICENSE file in the /ASDK-Licenses directory of this source tree. An additional
|
||
// grant of patent rights can be found in the PATENTS file in the same directory.
|
||
//
|
||
// Modifications to this file made after 4/13/2017 are: Copyright (c) 2017-present,
|
||
// Pinterest, Inc. Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
|
||
#import "_ASCollectionReusableView.h"
|
||
#import <AsyncDisplayKit/ASCellNode+Internal.h>
|
||
#import <AsyncDisplayKit/ASCollectionElement.h>
|
||
|
||
@implementation _ASCollectionReusableView
|
||
|
||
- (ASCellNode *)node
|
||
{
|
||
return self.element.node;
|
||
}
|
||
|
||
- (void)setElement:(ASCollectionElement *)element
|
||
{
|
||
ASDisplayNodeAssertMainThread();
|
||
element.node.layoutAttributes = _layoutAttributes;
|
||
_element = element;
|
||
}
|
||
|
||
- (void)setLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
|
||
{
|
||
_layoutAttributes = layoutAttributes;
|
||
self.node.layoutAttributes = layoutAttributes;
|
||
}
|
||
|
||
- (void)prepareForReuse
|
||
{
|
||
self.layoutAttributes = nil;
|
||
|
||
// Need to clear element before UIKit calls setSelected:NO / setHighlighted:NO on its cells
|
||
self.element = nil;
|
||
[super prepareForReuse];
|
||
}
|
||
|
||
/**
|
||
* In the initial case, this is called by UICollectionView during cell dequeueing, before
|
||
* we get a chance to assign a node to it, so we must be sure to set these layout attributes
|
||
* on our node when one is next assigned to us in @c setNode: . Since there may be cases when we _do_ already
|
||
* have our node assigned e.g. during a layout update for existing cells, we also attempt
|
||
* to update it now.
|
||
*/
|
||
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
|
||
{
|
||
self.layoutAttributes = layoutAttributes;
|
||
}
|
||
|
||
/**
|
||
* Keep our node filling our content view.
|
||
*/
|
||
- (void)layoutSubviews
|
||
{
|
||
[super layoutSubviews];
|
||
self.node.frame = self.bounds;
|
||
}
|
||
|
||
@end
|
||
|
||
/**
|
||
* A category that makes _ASCollectionReusableView conform to IGListBindable.
|
||
*
|
||
* We don't need to do anything to bind the view model – the cell node
|
||
* serves the same purpose.
|
||
*/
|
||
#if __has_include(<IGListKit/IGListBindable.h>)
|
||
|
||
#import <IGListKit/IGListBindable.h>
|
||
|
||
@interface _ASCollectionReusableView (IGListBindable) <IGListBindable>
|
||
@end
|
||
|
||
@implementation _ASCollectionReusableView (IGListBindable)
|
||
|
||
- (void)bindViewModel:(id)viewModel
|
||
{
|
||
// nop
|
||
}
|
||
|
||
@end
|
||
|
||
#endif
|