前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >仿淘宝类电商秒杀分页控件(附源码)

仿淘宝类电商秒杀分页控件(附源码)

作者头像
网罗开发
发布于 2021-04-28 07:09:36
发布于 2021-04-28 07:09:36
1.4K00
代码可运行
举报
文章被收录于专栏:网罗开发网罗开发
运行总次数:0
代码可运行

1. 前言

最近公司一个电商应用要实现一个类似淘宝淘抢购页面逻辑的功能,起初本来想找个第三方的组件,后面发现网上并没有类似的实现。所以后面决定自己封装一个,效果如下所示:

2. 功能特点

  • 实现了菜单切换的视觉差,效果棒棒哒;
  • 使用简单,创建一个控制器直接继承GFPageViewController,设置需要添加的子控制器、标题、副标题就搞定;
  • 菜单大部分的样式都可进行自定义;
  • 菜单遮罩的颜色、大小和箭头的大小也可以设置参数来控制;
  • 菜单实现了防止用户连续点击功能;
  • 支持pod导入.

3. 组件导入

组件支持直接将组件文件夹拖入工程和使用Pods管理两种方式导入:

▐ 3.1 直接将组件文件夹拖入工程方式

把 GFPageControler 文件夹拖到工程中,选择 copy

组件相关文件夹.png

▐ 3.2 Pods导入方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pod 'GFPageController'

4. 组件使用

▐ 4.1 基本使用方式

创建一个控制器继承自GFPageViewController,创建完之后给控制器设置需要添加的子控制器(Array)、标题(Array)、副标题(Array):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <UIKit/UIKit.h>
#import "GFPageViewController.h"
@interface PageViewController : GFPageViewController
@end
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@implementation PageViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self configureContentView];
}

- (void)configureContentView {
    NSArray *titles             = @[@"8:00",@"10:00",@"12:00",@"14:00",@"16:00",@"18:00",@"20:00"];
    NSArray *subTitles          = @[@"已结束",@"已结束",@"已结束",@"疯抢中",@"即将开始",@"即将开始",@"即将开始"];
    NSMutableArray *controllers = [NSMutableArray new];
    for (int i = 0; i < 7; i ++) {
        UIViewController *vc    = [[UIViewController alloc] init];
        vc.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1.0f];
        [controllers addObject:vc];
    }
    // 设置控制器数组
    self.controllers = controllers;
    // 设置标题数组
    self.titles      = titles;
    // 设置副标题数组
    self.subTitles   = subTitles;
    // 设置初始下标
    self.selectIndex = 1;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end   

OK,搞定,运行就可以看到效果,是不是很简单。

▐ 4.2 自定义菜单样式

可以看到上面没有一行设置菜单样式的代码,那是因为不设置菜单使用的是默认的样式,除此之外,菜单的样式还是可以自定义的, GFPageController为大家提供了下面14个参数来控制菜单的样式显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** MenuItem 的宽度 */
@property (nonatomic, assign) CGFloat itemWidth;
/** Menu 的高度 */
@property (nonatomic, assign) CGFloat menuHeight;
/** Menu 背景颜色 */
@property (nonatomic, strong) UIColor *menuBackgroundColor;
/** Menu mask的填充颜色 */
@property (nonatomic, strong) UIColor *maskFillColor;
/** Menu mask三角形的宽度 */
@property (nonatomic, assign) CGFloat triangleWidth;
/** Menu mask三角形的高度 */
@property (nonatomic, assign) CGFloat triangleHeight;

/** 标题未选中时的颜色 */
@property (nonatomic, strong) UIColor *normalTitleColor;
/** 标题选中时的颜色 */
@property (nonatomic, strong) UIColor *selectedTitleColor;
/** 标题文字字体 */
@property (nonatomic, strong) UIFont  *titleTextFont;
/** 标题文字高度 */
@property (nonatomic, assign) CGFloat titleTextHeight;

/** 副标题未选中时的颜色 */
@property (nonatomic, strong) UIColor *normalSubTitleColor;
/** 副标题选中时的颜色 */
@property (nonatomic, strong) UIColor *selectedSubTitleColor;
/** 副标题文字字体 */
@property (nonatomic, strong) UIFont  *subTitleTextFont;
/** 副标题文字高度 */
@property (nonatomic, assign) CGFloat subTitleTextHeight;

大家可以自行尝试!

5. 组件讲解

▐ 5.1 菜单视觉差实现

效果:

开始看淘宝里面的淘抢购页面时,发现了一个细节,如下:

淘抢购页面.png

可以发现,只要滚动到了中间红色那块区域的文字,颜色都会变成白色。。。 脑洞了很久也没有想到思路!后来网上查找,从一篇文章中得到了灵感 视错觉结合UI

原理:

原理其实很简单:就是弄两个视图,内容和位置一样,只是他们的文字颜色不一样而已!

实现:

知道了原理,那就开始构思:

1、我的实现思路是用UICollectionView来实现滚动菜单;

2、需要两个UICollectionView,UICollectionViewCell的文字内容一样,文字颜色区分;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma mark - 创建两个UICollectionView
// collectionViewTop
- (UICollectionView *)collectionViewTop {
    if (!_collectionViewTop) {
        _collectionViewTop                                = [[UICollectionView alloc] initWithFrame:CGRectMake(-self.collectionViewEdge, 0, self.bounds.size.width, self.itemHeight) collectionViewLayout:self.flowLayout];
        [_collectionViewTop registerClass:[GFMenuItem class] forCellWithReuseIdentifier:GFMENUITEM_NIBNAME];
        _collectionViewTop.tag                            = TOP_COLLECTIONVIEW_TAG;
        _collectionViewTop.backgroundColor                = [UIColor clearColor];
        _collectionViewTop.showsHorizontalScrollIndicator = NO;
        _collectionViewTop.decelerationRate               = 0;//设置手指放开后的减速率(值域 0~1 值越小减速停止的时间越短),默认为1
        _collectionViewTop.delegate                       = self;
        _collectionViewTop.dataSource                     = self;
    }
    return _collectionViewTop;
}

// collectionViewBottom
- (UICollectionView *)collectionViewBottom {
    if (!_collectionViewBottom) {
        _collectionViewBottom                                = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:self.flowLayout];
        [_collectionViewBottom registerClass:[GFMenuItem class] forCellWithReuseIdentifier:GFMENUITEM_NIBNAME];
        _collectionViewBottom.tag                            = BOTTOM_COLLECTIONVIEW_TAG;
        _collectionViewBottom.backgroundColor                = [UIColor clearColor];
        _collectionViewBottom.showsHorizontalScrollIndicator = NO;
        _collectionViewBottom.decelerationRate               = 0;//设置手指放开后的减速率(值域 0~1 值越小减速停止的时间越短),默认为1
        _collectionViewBottom.delegate                       = self;
        _collectionViewBottom.dataSource                     = self;
    }
    return _collectionViewBottom;
}

// flowLayout
- (UICollectionViewFlowLayout *)flowLayout {
    if (!_flowLayout) {
        _flowLayout                    = [[UICollectionViewFlowLayout alloc] init];
        _flowLayout.itemSize           = CGSizeMake(self.itemWidth, self.itemHeight);
        _flowLayout.sectionInset       = UIEdgeInsetsMake(0, self.collectionViewEdge, 0, self.collectionViewEdge);
        _flowLayout.minimumLineSpacing = 0;
        _flowLayout.scrollDirection    = UICollectionViewScrollDirectionHorizontal;
    }
    return _flowLayout;
}

#pragma mark - UICollectionViewDataSource
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    GFMenuItem *cell = [collectionView dequeueReusableCellWithReuseIdentifier:GFMENUITEM_NIBNAME forIndexPath:indexPath];
    NSString *title    = self.titles[indexPath.row];
    NSString *subTitle = self.subTitles[indexPath.row];
    // 区分颜色
    if (collectionView.tag == BOTTOM_COLLECTIONVIEW_TAG) {
        cell.titleColor    = self.normalTitleColor;
        cell.subTitleColor = self.normalSubTitleColor;
    } else {
        cell.titleColor    = self.selectedTitleColor;
        cell.subTitleColor = self.selectedSubTitleColor;
    }
    cell.titleText           = title;
    cell.subTitleText        = subTitle;
    return cell;
}

3、两个UICollectionView的滚动需要同步;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma makr - 同步滚动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UICollectionView *collectionView = (UICollectionView *)scrollView;
    //同步两个collectionView的滚动
    if (collectionView.tag == BOTTOM_COLLECTIONVIEW_TAG) {
        [_collectionViewTop setContentOffset:collectionView.contentOffset];
    } else {
        [_collectionViewBottom setContentOffset:collectionView.contentOffset];
    }
}
代码语言:javascript
代码运行次数:0
运行
复制

3、需要一个遮罩,一个UICollectionView在遮罩下面,一个在遮罩上面;

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[self addSubview:self.collectionViewBottom];
[self addSubview:self.maskView];
[self.maskView addSubview:self.collectionViewTop];
代码语言:javascript
代码运行次数:0
运行
复制

4、在遮罩上面的UICollectionView超出遮罩的部分的内容不显示出来;

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.maskView.clipsToBounds = YES;
代码语言:javascript
代码运行次数:0
运行
复制
▐ 5.2 使用UIBezierPath绘制遮罩

大家会发现这个遮罩是多边形的。 起初我的想法是用两种图片拼接起来,一张长方形,一张三角形,后来为了自定义性更高一点,改成了用UIBezierPath来进行绘制,代码如下:

自定义一个View继承自UIView:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "GFMaskView.h"

@implementation GFMaskView
- (void)drawRect:(CGRect)rect {
    UIBezierPath *path = [UIBezierPath bezierPath];
    // 画矩形
    path = [self drawReact:CGRectMake(0, 0, rect.size.width, rect.size.height - self.triangleHeight) fillColor:self.fillColor];
    // 画三角形
    CGPoint pointOne   = CGPointMake(rect.size.width/2 - self.triangleWidth/2, rect.size.height - self.triangleHeight);
    CGPoint pointTwo   = CGPointMake(rect.size.width/2, rect.size.height);
    CGPoint pointThree = CGPointMake(rect.size.width/2 + self.triangleWidth/2, rect.size.height - self.triangleHeight);
    path = [self drawTrianglePointOne:pointOne pointTwo:pointTwo pointThree:pointThree fillColor:self.fillColor];
}

// 画矩形
- (UIBezierPath *)drawReact:(CGRect)rect fillColor:(UIColor *)fillColor {
    UIBezierPath *rectPath = [UIBezierPath bezierPathWithRect:rect];
    [fillColor setFill];
    [rectPath fill];
    return rectPath;
}

// 画三角形
- (UIBezierPath *)drawTrianglePointOne:(CGPoint)pointOne pointTwo:(CGPoint)pointTwo pointThree:(CGPoint)pointThree fillColor:(UIColor *)fillColor {
    UIBezierPath *trianglePath = [UIBezierPath bezierPath];
    // 起点
    [trianglePath moveToPoint:pointOne];
    // draw the lines
    [trianglePath addLineToPoint:pointTwo];
    [trianglePath addLineToPoint:pointThree];
    [trianglePath closePath];
    [fillColor set];
    [trianglePath fill];
    return trianglePath;
}
▐ 5.3 GFPageViewController

到这里滚动菜单的实现就完成了。我的初衷其实就是把这个滚动菜单封装出来,后来发现使用这个菜单的大部分情况都是和多个子控制器一起使用,所以就再进行了一步封装,把控制器的逻辑都封装到了GFPageViewController控制器中。

这样使用起来就很方便,直接创建一个控制器继承GFPageViewController,再给他设置需要添加的子控制器、标题和副标题就 OK 了。

GFPageViewController的实现主要是让菜单和添加的子控制器能够联动,核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//  添加视图
- (void)setupContentView {
    [self.view addSubview:self.scrollView];
    [self.view addSubview:self.gfSegmentedControl];
}

// 滚动到指定下标的控制器
- (void)scrollControllerAtIndex:(int)index {
    CGFloat offsetX = index * GF_SCREEN_WIDTH;
    CGPoint offset = CGPointMake(offsetX, 0);
    if (fabs(self.scrollView.contentOffset.x - offset.x) > GF_SCREEN_WIDTH) {
        [self.scrollView setContentOffset:offset animated:NO];
        // 获得索引
        int index = (int)self.scrollView.contentOffset.x / self.scrollView.frame.size.width;
        [self addChildViewAtIndex:index];
    } else {
        [self.scrollView setContentOffset:offset animated:YES];
    }
}

// 添加子控制器的View到ScrollView上
- (void)addChildViewAtIndex:(int)index {
    // 设置选中的下标
    self.menuView.selectIndex = index;
    UIViewController *vc = self.childViewControllers[index];
    vc.view.frame = self.scrollView.bounds;
    [self.scrollView addSubview:vc.view];
}

#pragma mark - UIScrollViewDelegate
// 滚动动画结束后调用(代码导致)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView*)scrollView {
    // 添加控制器
    if (self.controllers) {
        // 获得索引
        int index = (int)self.scrollView.contentOffset.x / self.scrollView.frame.size.width;
        [self addChildViewAtIndex:index];
    }
}

// 滚动结束(手势导致)
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView {
    [self scrollViewDidEndScrollingAnimation:scrollView];
}

#pragma mark - getter
- (UIScrollView *)scrollView {
    if (!_scrollView) {
        CGFloat scrollViewY = _menuHeight;
        if (self.navigationController && !self.navigationController.navigationBar.hidden) {
            scrollViewY = _menuHeight + 64;
        }
        _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, scrollViewY, GF_SCREEN_WIDTH, GF_SCREEN_HEIGHT - _menuHeight)];
        _scrollView.contentSize                    = CGSizeMake(_controllers.count * GF_SCREEN_WIDTH, 0);
        _scrollView.pagingEnabled                  = YES;
        _scrollView.bounces                        = NO;
        _scrollView.showsHorizontalScrollIndicator = NO;
        _scrollView.delegate                       = self;
    }
    return _scrollView;
}

- (GFMenuView *)gfSegmentedControl {
    if (!_menuView) {
        CGFloat segmentedControlY = 0;
        if (self.navigationController && !self.navigationController.navigationBar.hidden) {
            segmentedControlY = 64;
        }
        _menuView = [GFMenuView gfMenuViewWithFrame:CGRectMake(0, segmentedControlY, GF_SCREEN_WIDTH, _menuHeight) titles:_titles subTitles:_subTitles];
        gfWeakSelf(weakSelf);
        _menuView.clickIndexBlock = ^(int clickIndex) {
            [weakSelf scrollControllerAtIndex:clickIndex];
        };
    }
    return _menuView;
}

#pragma mark - setter
// set dataSource
- (void)setControllers:(NSArray<UIViewController *> *)controllers {
    _controllers            = [controllers copy];
    self.scrollView.contentSize = CGSizeMake(_controllers.count * GF_SCREEN_WIDTH, 0);
    // 添加子控制器
    for (UIViewController *vc in controllers) {
        [self addChildViewController:vc];
        [vc didMoveToParentViewController:self];
    }
    if (self.selectIndex != 0) {
        // 添加指定下标控制器
        [self addChildViewAtIndex:self.selectIndex];
    } else {
        // 默认添加第一个控制器
        [self addChildViewAtIndex:0];
    }
}

- (void)setTitles:(NSArray<NSString *> *)titles {
    _titles                        = [titles copy];
    self.gfSegmentedControl.titles = titles;
}

- (void)setSubTitles:(NSArray<NSString *> *)subTitles {
    _subTitles                        = [subTitles copy];
    self.gfSegmentedControl.subTitles = subTitles;
}

6 结语

哈哈,这也算是自己第一次封装一个完整易用的组件,从中学习到了不少东西。

其中比如自定义View的正确姿势;UIScrollView中一些代理使用的细节问题;让自己的组件支持Pods等。

获取源码方式:点击左上方「网罗开发」关注并回复 “210425” 即可获取。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网罗开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
        前几篇博客从UICollectionView的基础应用到设置UICollectionViewFlowLayout更加灵活的进行布局,但都限制在系统为我们准备好的布局框架中,还是有一些局限性,例如,如果我要进行瀑布流似的不定高布局,前面的方法就很难满足我们的需求了,如下:
珲少
2018/08/15
3.2K0
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流
上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看《iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调》。UICollectionView之所以强大,是因为其具有自定义功能,这一自定义就不得了啦,自由度非常大,定制的高,所以功能也是灰常强大的。本篇博客就不使用自带的流式布局了,我们要自定义一个瀑布流。自定义的瀑布流可以配置其参数: 每个Cell的边距,共有多少列,
lizelu
2018/01/11
1.4K0
iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流
iOS流布局UICollectionView系列五——圆环布局的实现
        前边的几篇博客,我们了解了UICollectionView的基本用法以及一些扩展,在不定高的瀑布流布局中,我们发现,可以通过设置具体的布局属性类UICollectionViewLayoutAttributes来设置设置每个item的具体位置,我们可以再扩展一下,如果位置我们可以自由控制,那个布局我们也可以更加灵活,就比如创建一个如下的circleLayout:
珲少
2018/08/16
1.6K0
iOS流布局UICollectionView系列五——圆环布局的实现
iOS 瀑布流实现「建议收藏」
我们将collectionview定义为一个属性变量,并在viewDidLoad中对其进行设置:首先我们创建了一个布局对象(layout),类型是我们自己定义的布局类(WaterfallFlowLayout),接着我们又对属性变量collectionview进行了创建,设置了他的frame。然后就是对其代理的设置,collectionview的代理有三个,除了和tableview相同的代理和数据源之外,还有一个布局的代理(UICollectionViewDelegateFlowLayout),这里只设置了两个代理,就是数据源和处理事件的代理。这里需要注意的是tableview的重用机制不需要注册,但是collectionview必须要注册,注册的类是自己定义的cell的类(WaterFallCollectionViewCell),然后再跟上标识。值得一提的是collectionview只能采用重用的方式来加载cell。
全栈程序员站长
2022/11/17
2.6K1
iOS 瀑布流实现「建议收藏」
iOS 封装跑马灯和轮播效果
iOS UICollectionView实现跑马灯和轮播效果.gif 功能描述:WSL_RollView 是基于UICollectionView实现的支持水平和垂直两个方向上的的分页和渐进循环轮播效果,可以设置时间间隔、渐进速率、是否循环、分页宽度和间隔,还支持高度自定义分页视图的控件。 一、实现方法 ①、 首先用UICollectionView和计时器实现一个基本的水平滚动效果,如下图,这个太简单就不在此详述。 iOS UICollectionView ②、对比上面的效果图,我们还需要解决分页的宽度
且行且珍惜_iOS
2018/10/10
4.3K0
iOS 封装跑马灯和轮播效果
UICollectionView 很简单的写个瀑布流
你项目中要用到它吗? 可能会在你的项目中用到这玩意,最近也是要用就简单的写了一个 Demo。没多少代码,就不放Git了,下面会详细点的说说代码的,要还有什么问题的小伙伴可以直接Q我,也可以把Demo发给你,这里有Q可以找一下加我 多多交流,互相学习!    下面是简单的一个效果图,先给看看效果图! 739006-20160607165303027-1215360678.png 先说说控制器里面的代码,控制器里面就是我们的  UICollectionView  的一些基本的创建了。其实它和 UITabl
Mr.RisingSun
2018/01/09
1.1K0
UICollectionView 很简单的写个瀑布流
Swift 自定义布局实现 Cover Flow 效果
大家早上好,今天我又给大家带来了一篇关于 UICollectionView 系列的文章,在上一篇文章中,我们实现了一个酷炫的瀑布流布局,带大家初步的了解了在 UICollectionView 中该如何创建自定义布局。但是上一篇中实现的自定义布局稍显简单,只能说是比较粗略的计算了下布局各个 item 的位置,搞明白了继承自 UICollectionFlowLayout 子类它需要重载的方法的意义,那么今天这篇文章我们就来实现一个更加复杂的自定义布局: Cover Flow 效果吧!
HelloWorld杰少
2022/08/04
2K0
Swift 自定义布局实现 Cover Flow 效果
iOS流布局UICollectionView系列七——三维中的球型布局
        通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑布流布局,再到平面中的圆环布局,我们突破了线性布局的局限,在后面,我们将布局扩展到了空间,在Z轴上进行了平移,我们实现了一个类似UIPickerView的布局模型,其实我们还可以再进一步,类比于平面布局,picKerView只是线性排列布局在空间上的旋转与平移,这次,我们更加充分了利用一下空间的尺寸,来设计一个圆球的布局模型。以下是前几篇博客地址:
珲少
2018/08/16
1.5K0
iOS流布局UICollectionView系列七——三维中的球型布局
iOS流布局UICollectionView系列三——使用FlowLayout进行更灵活布局
        前面的博客介绍了UICollectionView的相关方法和其协议中的方法,但对布局的管理类UICollectionViewFlowLayout没有着重探讨,这篇博客介绍关于布局的相关设置和属性方法。
珲少
2018/08/16
2.1K0
iOS流布局UICollectionView系列三——使用FlowLayout进行更灵活布局
iOS流水布局UICollectionView简单使用引实现结
开发中我们最常看到的可能是表视图UITableView了,但其实还有一个视图也很常见,特别是一些图片、商品、视频的展示界面,用UICollectionView来展现往往会更加方便。
Cloudox
2021/11/23
1.2K0
iOS流水布局UICollectionView简单使用引实现结
iOS-UIScrollerView
xy_ss
2023/11/22
2680
iOS-UIScrollerView
封装内嵌UICollectionView和UIPageControl的ScrollView
该文章介绍了一种封装内嵌UICollectionView和UIPageControl的ScrollView,可以用于实现相册滑动、页面跳转、长列表等效果。该方案使用UICollectionView封装了相册视图,使用UIPageControl实现了分页效果。在初始化时,先设置UICollectionView的数据源,再设置UICollectionView的属性,最后在实现UICollectionView的代理方法。该方案可以用于实现相册滑动、页面跳转、长列表等效果,并且易于使用。","summary_url":"http://www.open-open.com/lib/view/28955843476
MelonTeam
2018/01/04
1.8K0
封装内嵌UICollectionView和UIPageControl的ScrollView
新闻类App顶部菜单栏封装
最近有一个需求,类似今日头条顶部的菜单栏。唯一区别是需要带可移动的下划线。网上查找资料,发现解决方案大部分是用UIScrollView实现。下方VC控制用UICollectionView。这样可以解决问题,但是不完美,当标签很多的时候,这时候的UIScrollView上会有大量写死的Button,没有达到复用的目的。所以自己封装了一个空间。菜单栏使用UICollectionView,VC控制使用PageViewController。
王大锤
2018/12/20
1.2K0
手把手带你撸一个网易云音乐首页(三)
Hello, 大家好,今天准备和大家继续分享如何利用 Swift 来实现一个网易云音乐的首页;上俩篇文章文章发布以后,我收获了不少小伙伴的关注与点赞,同时也得到了一些非常有用的建议,在这里再次感谢大家的认可, 你们的鼓励与建议是我技术输出路上最大的动力。
HelloWorld杰少
2022/08/04
2.5K0
手把手带你撸一个网易云音乐首页(三)
Swift 探索 UICollectionView 之 SupplementaryView 和 Decoration View
大家早上好,又到了每周和大家分享开发心得的时间啦!上周我分享了一篇关于 UICollectionView 自定义布局实现 Cover Flow 的文章(文章直通车),这也是我分享的关于 UICollectionView 系列的第四篇文章了,那今天我还是继续给大家带来 UICollectionView 开发系列的第五篇,这也是该系列计划写的最后一篇啦!当然,如果苹果开发者团队推出了关于 UICollectionView 的新的技术或者是我在开发中发现了新的技术点,我还是会持续更新这个系列,最终的目的是我希望通过这个系列的文章能把 UICollectionView 这个控件的核心技术点汇总齐全,毕竟 UICollectionView 使用的范围太广泛了。
HelloWorld杰少
2022/08/04
2.4K0
Swift  探索 UICollectionView 之 SupplementaryView 和 Decoration View
Swift日常开发随笔
提示:之所以为空白,是因为我把下拉列表中的tableView.reloadData()这行代码屏蔽掉了,加入的数组没有刷新。
编程怪才-凌雨画
2020/10/11
2.1K0
高效学习iOS —— Stroke和路径动画
先添加需要的代码,这里需要将storyboard的ViewController换成
CC老师
2022/01/14
2K0
高效学习iOS —— Stroke和路径动画
从案例出发,由浅到深了解 iOS 动画
iOS 的动画框架很成熟,提供必要的信息,譬如动画的起始位置与终止位置,动画效果就出来了
猿_人类
2019/11/07
8380
使用 UICollectionView 实现首页卡片轮播效果
今天跟大家来聊聊一个强大的 UI 控件:UICollectionView。UICollectionView 是 iOS6 之后引入的一个新的 UI 控件,与 UITableView 有着很多相似的地方,在开发过程中我们都会选择使用它们俩来为 App 的整个页面进行布局,比如说淘宝的首页;相比 UITbleView,UICollectionView 的功能比它要强大的多,它支持水平与垂直俩种方向的布局,开发者可以完全自定义一套 layout 布局方案,实现出意想不到的效果。
HelloWorld杰少
2022/08/04
2.3K0
使用 UICollectionView 实现首页卡片轮播效果
iOS开发UIScrollView使用详解 原
@property(nonatomic)CGPoint contentOffset;
珲少
2018/08/16
1.8K0
推荐阅读
相关推荐
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档