iOS CollectionView the completed guide(2th) chapter 04 Example Dimensions
2015-02-03 22:09
225 查看
Today, I learned the iOS CollectionView the completed guide(2th) chapter 04
there is one demo project Called Dimensions. this project is for demonstrating how to add layoutAttributes
for customizing the collectionView. Such as the CollectionViewCell's contentView has a imageView. how to set the imageView's contentMode for different value(UIViewContentModeScaleAspectFill, UIViewContentModeScaleAspectFit) .the solution is below.
1. define a new enum for ContentMode
typedef enum : NSUInteger{
AFCollectionViewFlowLayoutModeAspectFit,
//Default
AFCollectionViewFlowLayoutModeAspectFill
}AFCollectionViewFlowLayoutMode;
2.Subclass UICollectionViewLayoutAttributes
@interface AFCollectionViewLayoutAttributes :
UICollectionViewLayoutAttributes
@property (nonatomic,
assign) AFCollectionViewFlowLayoutMode layoutMode;
@end
3.Subclass UICollectionViewFlowLayout
@interface AFCollectionViewFlowLayout :
UICollectionViewFlowLayout
@property (nonatomic,
assign) AFCollectionViewFlowLayoutMode layoutMode;
@end
4.Override +(Class)layoutAttributesClass in superClass UICollectionViewFlowLayout
+(Class)layoutAttributesClass
{
// Important for letting UICollectionView know what kind of attributes to use.
return [AFCollectionViewLayoutAttributes
class];
}
5.Override Methods
#pragma mark Cell Layout
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *attributesArray = [super
layoutAttributesForElementsInRect:rect];
for (AFCollectionViewLayoutAttributes *attributes
in attributesArray)
{
[self
applyLayoutAttributes:attributes];
}
return attributesArray;
}
#pragma mark - Private Helper Methods
-(void)applyLayoutAttributes:(AFCollectionViewLayoutAttributes *)attributes
{
// Check for representedElementKind being nil, indicating this is a cell and not a header or decoration view
if (attributes.representedElementKind == nil)
{
// Pass our layout mode onto the layout attributes
attributes.layoutMode = self.layoutMode;
if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:layoutModeForItemAtIndexPath:)])
{
attributes.layoutMode = [(id<AFCollectionViewDelegateFlowLayout>)self.collectionView.delegate collectionView:self.collectionView layout:selflayoutModeForItemAtIndexPath:attributes.indexPath];
}
}
}
#pragma mark - Overridden Properties
-(void)setLayoutMode:(AFCollectionViewFlowLayoutMode)layoutMode
{
// Update our backing ivar...
_layoutMode = layoutMode;
// then invalidate our layout.
[self
invalidateLayout];
}
#pragma mark - Overide -(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes in UICollectionViewCell
#pragma mark - Overridden Methods
-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
[super
applyLayoutAttributes:layoutAttributes];
// Important! Check to make sure we're actually this special subclass.
// Failing to do so could cause the app to crash!
if (![layoutAttributes
isKindOfClass:[AFCollectionViewLayoutAttributes
class]])
{
return;
}
AFCollectionViewLayoutAttributes *castedLayoutAttributes = (AFCollectionViewLayoutAttributes *)layoutAttributes;
layoutMode = castedLayoutAttributes.layoutMode;
[self
setImageViewFrame];
}
Conclusion: 1. be aware of the difference between the UIViewContentModeScaleAspectFill and UIViewContentModeScaleAspectFit
2. be aware of the bounds, frame, center of UIView
3. know how to calculate the aspectRatio according to the imageView.image.size
4. know the layoutAttributesForElementInRect from UICollectionViewFlowLayout and -(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
in UICollectionViewCell was called by iOS before the
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath
*)indexPath.
there is one demo project Called Dimensions. this project is for demonstrating how to add layoutAttributes
for customizing the collectionView. Such as the CollectionViewCell's contentView has a imageView. how to set the imageView's contentMode for different value(UIViewContentModeScaleAspectFill, UIViewContentModeScaleAspectFit) .the solution is below.
1. define a new enum for ContentMode
typedef enum : NSUInteger{
AFCollectionViewFlowLayoutModeAspectFit,
//Default
AFCollectionViewFlowLayoutModeAspectFill
}AFCollectionViewFlowLayoutMode;
2.Subclass UICollectionViewLayoutAttributes
@interface AFCollectionViewLayoutAttributes :
UICollectionViewLayoutAttributes
@property (nonatomic,
assign) AFCollectionViewFlowLayoutMode layoutMode;
@end
3.Subclass UICollectionViewFlowLayout
@interface AFCollectionViewFlowLayout :
UICollectionViewFlowLayout
@property (nonatomic,
assign) AFCollectionViewFlowLayoutMode layoutMode;
@end
4.Override +(Class)layoutAttributesClass in superClass UICollectionViewFlowLayout
+(Class)layoutAttributesClass
{
// Important for letting UICollectionView know what kind of attributes to use.
return [AFCollectionViewLayoutAttributes
class];
}
5.Override Methods
#pragma mark Cell Layout
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *attributesArray = [super
layoutAttributesForElementsInRect:rect];
for (AFCollectionViewLayoutAttributes *attributes
in attributesArray)
{
[self
applyLayoutAttributes:attributes];
}
return attributesArray;
}
#pragma mark - Private Helper Methods
-(void)applyLayoutAttributes:(AFCollectionViewLayoutAttributes *)attributes
{
// Check for representedElementKind being nil, indicating this is a cell and not a header or decoration view
if (attributes.representedElementKind == nil)
{
// Pass our layout mode onto the layout attributes
attributes.layoutMode = self.layoutMode;
if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:layoutModeForItemAtIndexPath:)])
{
attributes.layoutMode = [(id<AFCollectionViewDelegateFlowLayout>)self.collectionView.delegate collectionView:self.collectionView layout:selflayoutModeForItemAtIndexPath:attributes.indexPath];
}
}
}
#pragma mark - Overridden Properties
-(void)setLayoutMode:(AFCollectionViewFlowLayoutMode)layoutMode
{
// Update our backing ivar...
_layoutMode = layoutMode;
// then invalidate our layout.
[self
invalidateLayout];
}
#pragma mark - Overide -(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes in UICollectionViewCell
#pragma mark - Overridden Methods
-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
[super
applyLayoutAttributes:layoutAttributes];
// Important! Check to make sure we're actually this special subclass.
// Failing to do so could cause the app to crash!
if (![layoutAttributes
isKindOfClass:[AFCollectionViewLayoutAttributes
class]])
{
return;
}
AFCollectionViewLayoutAttributes *castedLayoutAttributes = (AFCollectionViewLayoutAttributes *)layoutAttributes;
layoutMode = castedLayoutAttributes.layoutMode;
[self
setImageViewFrame];
}
Conclusion: 1. be aware of the difference between the UIViewContentModeScaleAspectFill and UIViewContentModeScaleAspectFit
2. be aware of the bounds, frame, center of UIView
3. know how to calculate the aspectRatio according to the imageView.image.size
4. know the layoutAttributesForElementInRect from UICollectionViewFlowLayout and -(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
in UICollectionViewCell was called by iOS before the
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath
*)indexPath.
相关文章推荐
- Collection View Programming Guide for iOS-Using the Flow Layout
- Collection View Programming Guide for iOS---(四)---Using the Flow Layout
- View Controller Programming Guide for iOS---(七)---Resizing the View Controller’s Views
- Collection View Programming Guide for iOS---(七)---Custom Layouts: A Worked Example
- Table View Programming Guide for iOS---(三)----Overview of the Table View API
- Chapter 5:collection view - iOS 8 Swift Programming cookBook 读书笔记
- Collection View Programming Guide for iOS---(六)---Creating Custom Layouts
- MapKit and Text Input(Chapter 5 of iOS Programming: The Big Nerd Ranch Guide)
- Delegation and Core Location(Chapter 4 of iOS Programming: The Big Nerd Ranch Guide)
- Collection View Programming Guide for iOS---(二)----Collection View Basics
- Memory Management(Chapter 3 of iOS Programming: The Big Nerd Ranch Guide)
- View Controllers(Chapter 7 of iOS Programming: The Big Nerd Ranch Guide)
- Collection View Programming Guide for iOS---(三)---Designing Your Data Source and Delegate
- Subclassing UIView(Chapter 6 of iOS Programming: The Big Nerd Ranch Guide)
- Collection View Programming Guide for iOS---(一)----About iOS Collection Views
- Collection View Programming Guide for iOS---(五)---Incorporating Gesture Support
- View Controller Programming Guide for iOS---(八)---Using View Controllers in the Responder Chain
- iOS Programming: The Big Nerd Ranch Guide (4th Edition) 阅读笔记-关于View和View Hierarchy
- The Definitive Guide to symfony | Chapter 15 - Unit And Functional Testing | symfony | Web PHP Framework
- Scroll View Programming Guide for iOS 笔记