Tip: 自己开发了好玩的APP: 《小明搜索》(App Store上搜索:"小明搜索")
[点击下载 "小明搜索"](https://itunes.apple.com/cn/app/小明搜索/id1378798470?l=en&mt=8)
1、集必应、百度、搜狗为一体的搜索平台
2、用户随意收藏或添加自己喜欢的网站
3、网页文字播放功能
4、收藏网页的视频,本地播放
5、附加常用小工具
6、后台播放网页音频
7、3D Touch提供便捷入口
完全自定义的搜索助手,简约的爱不释手~
该APP不断完善中~
#import <UIKit/UIKit.h>@interface CustomFlowLayout : UICollectionViewFlowLayout
@property(nonatomic, assign)IBOutlet id <UICollectionViewDelegateFlowLayout> delegate;
@end
#import "CustomFlowLayout.h"
@interface CustomFlowLayout ()<UICollectionViewDelegateFlowLayout>
@property(nonatomic, strong)NSMutableArray* attributeArray;
@property(nonatomic, strong)UICollectionViewLayoutAttributes* headerAttributes;
@property(nonatomic, strong)UICollectionViewLayoutAttributes* footerAttribytes;
@end
@implementation CustomFlowLayout
- (void)prepareLayout{
self.attributeArray = [[NSMutableArray alloc] init];
[super prepareLayout];
NSInteger numberOfSections = 1;
//行数
if([self.collectionView.dataSource respondsToSelector:@selector(numberOfSectionsInCollectionView:)]){
numberOfSections = [self.collectionView.dataSource numberOfSectionsInCollectionView:self.collectionView];
}
CGFloat totalHeight = 0;
CGFloat itemSpacing = self.minimumInteritemSpacing;
for (int i = 0; i < numberOfSections; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:i];
UIEdgeInsets sectionInset = self.sectionInset;
if([self.delegate respondsToSelector:@selector(collectionView:layout:insetForSectionAtIndex:)]){
sectionInset = [self.delegate collectionView:self.collectionView layout:self insetForSectionAtIndex:i];
}
CGSize sectionHeaderSize = self.headerReferenceSize;
CGSize sectionFooterSize = self.footerReferenceSize;
if([self.delegate respondsToSelector:@selector(collectionView:layout:referenceSizeForHeaderInSection:)]){
sectionHeaderSize = [self.delegate collectionView:self.collectionView layout:self referenceSizeForHeaderInSection:i];
}
if([self.delegate respondsToSelector:@selector(collectionView:layout:referenceSizeForFooterInSection:)]){
sectionFooterSize = [self.delegate collectionView:self.collectionView layout:self referenceSizeForFooterInSection:i];
}
CGFloat colHeight[2] = {0, 0};
UICollectionViewLayoutAttributes* attribute;
if(sectionHeaderSize.height > 0){
attribute = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader withIndexPath:indexPath];
attribute.frame = CGRectMake(sectionInset.left, sectionInset.top + totalHeight, sectionHeaderSize.width, sectionHeaderSize.height);
[self.attributeArray addObject:attribute];
}
if(sectionFooterSize.height > 0){
attribute = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter withIndexPath:indexPath];
attribute.frame = CGRectMake(sectionInset.left, sectionInset.top, sectionFooterSize.width, sectionFooterSize.height);
[self.attributeArray addObject:attribute];
}
totalHeight += sectionHeaderSize.height;
totalHeight += sectionFooterSize.height;
NSInteger numberOfItemsInSection = 0;
if([self.collectionView.dataSource respondsToSelector:@selector(collectionView:numberOfItemsInSection:)]){
numberOfItemsInSection = [self.collectionView.dataSource collectionView:self.collectionView numberOfItemsInSection:i];
}
for (int j = 0; j < numberOfItemsInSection; j++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:j inSection:i];
UICollectionViewLayoutAttributes * attris = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
CGSize size = CGSizeZero;
NSInteger colum = 0;
if([self.delegate respondsToSelector:@selector(collectionView:layout:minimumInteritemSpacingForSectionAtIndex:)]){
itemSpacing = [self.delegate collectionView:self.collectionView layout:self minimumInteritemSpacingForSectionAtIndex:i];
}
if([self.delegate respondsToSelector:@selector(collectionView:layout:sizeForItemAtIndexPath:)]){
size = [self.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath];
if(colHeight[0] <= colHeight[1]){
colHeight[0] = colHeight[0] + size.height + itemSpacing;
colum = 0;
}else{
colHeight[1] = colHeight[1] + size.height + itemSpacing;
colum = 1;
}
}
attris.frame = CGRectMake(sectionInset.left + (itemSpacing + size.width) * colum, colHeight[colum] - size.height - itemSpacing + totalHeight, size.width, size.height);
[self.attributeArray addObject:attris];
}
CGFloat maxHeight = MAX(colHeight[0], colHeight[1]);
totalHeight += (maxHeight -itemSpacing);
}
}
- (CGSize)collectionViewContentSize{
CGRect frame = [[self.attributeArray lastObject] frame];
return CGSizeMake(self.collectionView.frame.size.width, frame.origin.y + frame.size.height);
}
- (NSArray<UICollectionViewLayoutAttributes*> *)layoutAttributesForElementsInRect:(CGRect)rect{
return self.attributeArray;
}
- (nullable UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath{
return self.headerAttributes;
}
@end
相关推荐
瀑布流布局的核心在于UICollectionViewFlowLayout的自定义。默认的布局是水平和垂直滚动的一维布局,我们需要扩展它以实现多列布局。在Swift中创建一个继承自UICollectionViewFlowLayout的新类,重写`...
在这个文章中,作者可能会介绍如何设置UICollectionView,以及如何通过自定义UICollectionViewFlowLayout来实现瀑布流布局。通常,这些步骤会包括以下几个部分: 1. 创建UICollectionView并设置数据源和代理。 2. ...
在这个"瀑布流UIcollectionViewLayout(swift)"项目中,开发者利用Swift语言创建了一个自定义的UICollectionViewFlowLayout,使得每个单元格可以根据内容自动调整大小,形成连续的多列布局。 首先,我们需要了解...
1. UICollectionViewFlowLayout:这是UICollectionView的默认布局,但它并不支持瀑布流布局。为了实现瀑布流布局,我们需要自定义UICollectionViewLayout。自定义布局需要重写以下方法: - `prepare()`: 在这里...
UICollectionViewFlowLayout是UICollectionView的默认布局,虽然它不直接支持瀑布流,但可以通过一些技巧进行改造。例如,可以为每个section设置不同的columnCount(列数),并通过监听UICollectionView的size变化...
在Objective-C中,你可以使用UICollectionView来实现瀑布流布局,利用UICollectionViewFlowLayout进行自定义布局。Swift中则有类似的功能,但语法和API设计更现代化。 总的来说,这个“oc瀑布流小测试”项目可能是...
在项目压缩包中的"横向瀑布流"文件可能包含了实现这个功能的源代码,包括UICollectionView的子类、UICollectionViewCell的子类、自定义UICollectionViewFlowLayout的实现,以及可能的模型类和数据源管理代码。...
2. **设置UICollectionViewFlowLayout**:默认的UICollectionViewFlowLayout无法满足瀑布流的需求,因此我们需要继承UICollectionViewFlowLayout并重写其方法。主要需要重写以下几个方法: - `...
首先,要实现`UICollectionView`的瀑布流,我们需要理解并自定义UICollectionViewFlowLayout。这个布局类是UICollectionView的基础,它定义了cell的排列方式,间距,方向等。在`UICollectionViewFlowLayout`中,我们...
瀑布流布局,又称Masonry布局,是一种常见的网页和应用界面设计模式,特别是在手机端的使用相当广泛。这种布局方式模仿了瀑布下落的自然现象,使得内容元素(如图片、文字或商品)能够自上而下、从左到右连续排列,...
2. 创建自定义UICollectionViewFlowLayout:实现瀑布流的布局逻辑。 3. 注册单元格类:使用`registerClass: forCellWithReuseIdentifier:`或`registerNib: forCellWithReuseIdentifier:`方法。 4. 在`collectionView...
3. **WaterfallFlowLayout.swift**:瀑布流布局的自定义布局类,它继承自UICollectionViewFlowLayout。在这个类里,主要逻辑包括计算每个cell的位置,以及处理不同大小的item和屏幕尺寸的适配。 4. **...
开发者可以创建自定义UICollectionViewFlowLayout,重写其中的`layoutAttributesForElements(in:)`和`sizeForItemAt(_:)`方法,以实现瀑布流效果。 3. **UICollectionViewDataSource** 和 **...
1. **UICollectionViewFlowLayout**: 这是UICollectionView的基础布局类,我们可以通过自定义UICollectionViewFlowLayout来实现瀑布流效果。首先,我们需要创建一个继承自UICollectionViewFlowLayout的子类,并重写...
在iOS开发中实现瀑布流,主要涉及到自定义UICollectionViewFlowLayout和网络图片加载等内容。以下是对这个iOS瀑布流Demo的详细解读。 首先,瀑布流的核心在于UICollectionView,它是iOS中的一个强大的视图组件,...
在这个项目中,"COXRoundFlowLayout"可能是一个自定义的UICollectionViewFlowLayout子类,用于创建这种独特的圆形瀑布流效果。 首先,我们来详细了解一下瀑布流布局。瀑布流布局主要应用于UICollectionView,它是...
`MyFlowLayout`就是一个这样的自定义布局类,它扩展了UICollectionViewFlowLayout,使得在iOS应用中可以轻松实现瀑布流效果。开发者可以通过设置不同的列数、间距等属性来自定义布局。 `SDWebImage`是iOS开发中的一...
3. **自定义UICollectionViewFlowLayout**:UICollectionView是iOS中实现瀑布流布局的主要组件。你需要创建一个自定义的UICollectionViewFlowLayout,重写`layoutAttributesForElements(in:)`方法来计算每个cell的...
瀑布流布局,又称为Masonry布局,是一种在iOS应用中常用的设计模式,特别是在展示大量图片或者商品信息时,能够提供良好的用户体验。这种布局方式模仿了真实世界中瀑布流水的效果,使得屏幕上的元素自上而下排列,每...
- UICollectionViewFlowLayout:默认的布局方式,支持水平或垂直滚动,但不支持瀑布流。为了实现瀑布流,我们需要自定义UICollectionViewLayout子类。 - 自定义布局:需要重写`layoutAttributesForElements(in:)`...