• Stars
    star
    114
  • Rank 308,031 (Top 7 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

用UICollectionView实现的兴趣标签选择器 (A interest tag selector implemented with the UICollectionView.)

YLTagsChooser

用UICollectionView实现的兴趣标签选择器,可传入最多可选择标签数量和上一次选中的标签。

注意:UICollectionView在cell较多的情况下,在滑动的过程中会出现某些cell一会显示一会不显示的问题已解决,欢迎star和提出优化方案。

在这里我用UICollectionView实现了高度固定,宽度不固定,每行显示的标签个数不定的瀑布流效果。本示例只简单展示了类似UIActionSheet弹出效果。可以模仿实现其他类似效果。

核心思想就是在- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath方法中通过计算上一个cell的frame和当前cell的frame来判断将当前cell显示在什么位置。具体实现见代码。


A interest tag selector implemented with the UICollectionView, which allows you to pass in the maximum number of selectable tags and the last selected tags.

Here I use UICollectionView to achieve a high degree of fixed, the width is not fixed, each row shows the number of labels on the waterfall flow effect. This example only shows a similar UIActionSheet pop-up effect. It also Can be imitated to achieve other similar effects.

效果图 Demonstration :

2016-11-1 update

一、修复数据源较多的情况下部分cell不显示的bug:标签很多的时候,中间cell会不显示,而且会出现很多空白的地方 #1 (fixed bug #1)

二、实现可添加sectionheader的效果。(Show how to add a UICollectionReusableView.)

因为有人反映自定义UICollectionViewFlowLayout的情况下,方法

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView    
           viewForSupplementaryElementOfKind:(NSString *)kind 
                                 atIndexPath:(NSIndexPath *)indexPath

不调用的问题。我也做了尝试,确实是很容易就造成这个方法不被调用。

实现步骤总结如下:

1、设置自定义UICollectionViewFlowLayout对象的headerReferenceSize属性或者实现UICollectionViewDelegateFlowLayout的

- (CGSize)collectionView:(UICollectionView *)collectionView 
                  layout:(UICollectionViewLayout*)collectionViewLayout 
referenceSizeForHeaderInSection:(NSInteger)section

方法返回sectionheader的高度;

2、注册sectionheader:

[_myCollectionView registerClass:[YLCollectionReusableView class]
      forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
             withReuseIdentifier:@"YLCollectionReusableView”]

3、在方法

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView 
           viewForSupplementaryElementOfKind:(NSString *)kind 
                                 atIndexPath:(NSIndexPath *)indexPath

中返回自定义sectionheader;

需要注意的是在- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect方法中应该加上判断当前UICollectionViewLayoutAttributes的representedElementCategory属性是否是UICollectionElementCategoryCell类型的,不能在这里改变了sectionheader的高度导致显示异常。因为所有view和cell的属性都会调用该方法。

2017-06-15 update

一、新增默认选中的标签,下次进入页面会默认显示上次选中的标签。Can we retain selected tag ?(fixed bug #2)

可能同一个APP内会有多个页面会使用到标签选择器,并且每次选择的标签类型不太一样,所以建议将标签封装为一个对象:YLTag,每次显示YLTagsChooser的时候传入上次选中的值。

Maybe you have multiple pages in your APP will use the tags selector, and each time you select the tags, the type is not the same, it is recommended to package the tag as an object: YLTag, each time you display YLTagsChooser, you can pass the last selected The value to it.

2017-09-07 update

一、支持多Section,每个section一个header,解决高度计算问题。使用方法: 将每个分区的数据单独放在一个数组中,最后这些数组都放在orignDataArray里面,调用以下方法传入数据即可。

[chooser refreshWithTags:orignDataArray selectedTags:selectedTags];

2017-09-08 update

一、解决UICollectionView在滑动过程中有些cell一会显示一会不显示的问题。UICollectionView的重大bug?真相竟然是......

搜索UICollectionView some cell not appearUICollectionViewCell not appear可见相关问题。

这个bug主要是cell较多并且cell的frame属性自定义的情况下很容易发生。

因为我们的每个item的属性都是完全自定义的,所以在layoutAttributesForElementsInRect:方法如果直接调用[super layoutAttributesForElementsInRect: rect],拿到的这个集合其实是不对的,所以或导致有些cell在滑动过程中一会消失一会显示。

下面简单讲一下解决思路:

自定义UICollectionViewLayout必须覆盖的方法且执行顺序如下:

- (void)prepareLayout;
- (CGSize)collectionViewContentSize;
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect;
  • prepareLayout

布局快要生效的时候被调用,在这里将每个item的frame属性计算出来并缓存起来。

  • collectionViewContentSize

UICollectionView通过它获取可滑动范围,在这里根据上面计算的值获取最大可滚动范围。

  • layoutAttributesForElementsInRect:

返回指定区域内的item的布局属性(UICollectionViewLayoutAttributes对象)集合。

解决这个bug的要点是在layoutAttributesForElementsInRect:方法中先获取UICollectionView当前的可见范围,然后根据第一步计算并缓存起来的item属性来判断当前可见范围内有哪些item应该是可见的,把这些item对应的UICollectionViewLayoutAttributes对象放到一个数组中返回。

2018-2-7 update

Fix bug3, support set UICollectionView's contentInset and also support set setionHeader and sectionFooter at the same time.

修复bug:设置 collectionView.contentInset 时候,就会有问题 #3 (fixed bug #3)

  • 新增支持设置UICollectionview的contentInset。

举个栗子:

设置了_myCollectionView.contentInset = UIEdgeInsetsMake(30, 20, 30, 20);之后,需要在YLWaterFlowLayout中的如下方法返回UICollectionView的可滚动范围,否则你会发现它竟然可以左右滚动。

#pragma mark - CollectionView的滚动范围
//step2
- (CGSize)collectionViewContentSize
{
    //support set collectionview's contentInset
    CGFloat width = self.collectionView.frame.size.width - self.collectionView.contentInset.left - self.collectionView.contentInset.right;
    return CGSizeMake(width, _contentHeight);
}
  • 新增支持UICollectionview同时设置sectionHeader和sectionFooter。

已优化YLWaterFlowLayout的代码,支持同时设置UICollectionView的contentInset、layout的sectionInset、layout的headerReferenceSize和layout的footerReferenceSize,也可以正常地全部展示header、footer和cell。

效果图如下:

当然,这里只是提供一种解决UICollectionView滚动过程中部分cell一会显示一会不显示的问题思路。如果你需要实现其他效果,你可以自己尝试用我这种思路去实现,或者提出来,大家一起讨论一下怎么实现。如果帮到了你,请留下一个Star表示支持,谢谢!

More Repositories

1

DemoInPutPasswordView

仿微信支付密码输入框 (A input password alert view like wechat pay.)
Objective-C
44
star
2

DebugWindow

一个在真机上测试时方便查看输出日志的小工具。(A debug tool which helps you view the console logs on the device when you test you APP.)
Objective-C
36
star
3

YLAwesomePicker

最少只需三行代码就可以轻松实现数据拾取的一个自定义数据拾取器,并可以记录并展示上次选中的数据。(A custom data picker that requires only three lines of code to record and display the last selected data.)
Objective-C
33
star
4

Epub

一步一步学习如何制作一个EPub电子书阅读器。How to make a EPub e-book reader step by step.
Objective-C
23
star
5

YLSipColor

一个模仿Sip Color App实现颜色拾取的工具。(A tool to mimic the Sip Color App color picker.)
Objective-C
14
star
6

ATPagingByCell

A example of perfectly paging by smaller cell (only one cell at a time) not by screen, which like AppStore's banner and Alipay's banner. 一个使用UICollectionView实现非全屏cell的paging效果,就像AppStore游戏tab顶部banner和支付宝财富tab的财富直通车banner一样的效果(主要是非全屏cell的情况下实现不管是慢速拖拽还是快速拖拽都每次只轮播一个cell)。
Objective-C
14
star
7

YLNoImageModel

快速方便地让你的APP具有无图模式(省流量模式)功能,以及“点击加载图片”的功能。
Objective-C
6
star
8

YLPhotosPicker

模仿QQ和微信的图片拾取器,基于AssetsLibrary这个系统库。
Objective-C
5
star
9

ATCountingView

A counting view which can animate from 0~9, you can use it like UILabel. 滚动数字视图,你可以像UILabel一样使用它。
Swift
5
star
10

LMComBoxView

仿.net中的Combox下拉菜单
Objective-C
4
star
11

YLFollowMusicPlayer

一个在线音乐播放器,仅供学习。
Objective-C
4
star
12

YLAliPayAndCMBHome

仿支付宝首页效果(UIScrollView嵌入UITableView)和招商银行客户端首页效果。
Objective-C
2
star
13

effective-iOS-tricks

有效提高iOS开发效率的技巧集合,欢迎大家投稿参与。A collection of effective tricks for iOS develop, welcome to contribute.
2
star
14

ATPlayer

A video player base on AVPlayer.
Objective-C
1
star
15

ATMagnifier

这是一个简单的放大镜🔎效果,使用简单方便,无代码侵入。
Objective-C
1
star
16

Python

学习Python笔记。Life is short, you need Python.
1
star