文档章节

iOS日历控件

o
 osc_w9s1w4o0
发布于 2019/03/28 16:01
字数 644
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

项目需要,前一阵子重构了下iPad工程,添加了一个滚动无缝日历。

当时没有头绪,网上找了一个源码改吧改吧就上线了(参考链接),这个功能很多而且流畅性也特别好,推荐不会写的可以参考下。

这几天,活不太忙就把日历控件裁剪了下,做个最简单的滚动无缝日历。效果如下图:

 

日历可以左右滚动,点击某个日期后会变色,并且有回调。橘色的是标记日期,蓝色的是选择日期,蓝边的是当前日期,可以根据需要自行更改。

 

这个日历控件有两个比较复杂的地方:

  • UICollectionView默认情况下,横滚cell竖排竖滚cell横排,所以我们先要修改下cell的位置,自定义FlowLayout继承于UICollectionViewFlowLayout,重写它的prepareLayout方法。
    #import "EXCalendarCollectionViewFlowLayout.h"
    
    @interface EXCalendarCollectionViewFlowLayout ()
    
    @property (nonatomic, strong) NSMutableArray *allAttributes;
    
    @end
    
    
    @implementation EXCalendarCollectionViewFlowLayout
    
    - (void)prepareLayout {
        [super prepareLayout];
        
        self.allAttributes = [NSMutableArray array];
        
        NSInteger sections = [self.collectionView numberOfSections];
        for (int i = 0; i < sections; i++) {
            
            // setup one section attributes.
            NSMutableArray *tmpArray = [NSMutableArray array];
            
            NSInteger count = [self.collectionView numberOfItemsInSection:i];
            
            for (NSInteger j = 0; j < count; j++) {
                NSIndexPath *indexPath = [NSIndexPath indexPathForItem:j inSection:i];
                UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
                [tmpArray addObject:attributes];
            }
            
            [self.allAttributes addObject:tmpArray];
        }
    }
    
    
    - (CGSize)collectionViewContentSize {
        return [super collectionViewContentSize];
    }
    
    
    - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
        NSInteger item = indexPath.item;
        NSInteger x;
        NSInteger y;
        
        // 根据item的序号计算出item的行列位置
        [self targetPositionWithItem:item resultX:&x resultY:&y];
        
        // 根据已得出的item的行列位置,将item放入indexPath中对应的位置。
        NSInteger item2 =  [self orignItemAtX:x y:y];
        NSIndexPath *theNewIndexPath = [NSIndexPath indexPathForItem:item2 inSection:indexPath.section];
        
        UICollectionViewLayoutAttributes *theNewAttr = [super layoutAttributesForItemAtIndexPath:theNewIndexPath];
        theNewAttr.indexPath = indexPath;
        return theNewAttr;
    }
    
    
    - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
        NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
        
        NSMutableArray *tmp = [NSMutableArray array];
        
        for (UICollectionViewLayoutAttributes *attr in attributes) {
            for (NSMutableArray *attributes in self.allAttributes)
            {
                for (UICollectionViewLayoutAttributes *attr2 in attributes) {
                    if (attr.indexPath.item == attr2.indexPath.item) {
                        [tmp addObject:attr2];
                        break;
                    }
                }
                
            }
        }
        return tmp;
    }
    
    
    // 根据item计算目标item的位置。
    - (void)targetPositionWithItem:(NSInteger)item
                           resultX:(NSInteger *)x
                           resultY:(NSInteger *)y {
        //    NSInteger page = item / (self.itemCountPerRow * self.rowCountPerPage);
        
        NSInteger theX = item % self.itemCountPerRow;
        NSInteger theY = item / self.itemCountPerRow;
        
        if (x != NULL) {
            *x = theX;
        }
        
        if (y != NULL) {
            *y = theY;
        }
    }
    
    
    - (NSInteger)orignItemAtX:(NSInteger)x
                            y:(NSInteger)y {
        NSInteger item = x * self.rowCountPerPage + y;
        return item;
    }
    
    
    @end
    View Code

     


  • 当你在当前月份点击了一个日期,滑到其他月份,然后要对刚才选择的月份的效果进行更改时,比较麻烦。刚开始我在didSelectItemAtIndexPath委托方法中用cellForItemAtIndexPath进行获取时,不可见的cell获取不到返回的是空,然后在如何获取不可见的cell问题上纠结了两天,最终换了个解决方案,在cellForItemAtIndexPath中进行了判断,解决了这个问题,当然点击后直接有响应跳转的话,刚才这个功能就很鸡肋了。具体看代码吧。

 

源码地址:https://github.com/zhanghua0926/EXCalendar

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
PMCalendar

PMCalendar 是 iOS 上的一款日历控件,兼容 iOS 4.0 . 转载:http://www.adobex.com/ios/source/details/00001148.htm...

iosCode
2013/02/02
50
0
前端关于日历时间控件资料汇总

1.移动端仿iOS日期时间选择控件datePicker(http://www.jq22.com/jquery-info13151) 2.计算每个月的天数(http://blog.csdn.net/lwcumt/article/details/18305049) 3.苹果IOS浏览器上时间格式不...

IT追寻者
2017/05/09
46
0
PMCalendar

PMCalendar 是 iOS 上的一款日历控件,兼容 iOS 4.0 . 转载:http://www.adobex.com/ios/source/details/00001148.htm...

iosCode
2013/02/02
65
0
Programming iOS 12 免积分下载

图书说明: 如果您基于Swift,Xcode和Cocoa框架的基础知识,本书提供了所有基本的真实iOS应用程序组件的结构化解释。通过深入探索和丰富的代码示例,您将学习如何创建视图,操作视图控制器以...

起风了123
2019/01/06
5
0
带农历日历的DatePicker控件!Xamarin控件开发小记

闲来无事开发了个日期选择控件,感兴趣的同学前往: https://github.com/MatoApps/Mato.DatePicker Mato.DatePicker 说明 这是一个带有农历日历的日期选择Xamarin控件 可以指定初始日期 多选...

osc_srt16prk
2018/07/23
3
0

没有更多内容

加载失败,请刷新页面

加载更多

macz技巧分享—macOS高端使用技巧

Macos 的占有量不如 Windows,两者之间当操作方式也有很大的不同,当很多人熱悉 Windows 的操作之后,再接触 macos,觉得难上手,其实是习惯问题。如果你学习一些技巧,会觉得 macos 其实也不...

mac小叮当
53分钟前
11
0
手把手教你如何用黑白显示器显示彩色!

来源:大数据文摘 本文约1000字,建议阅读6分钟。 本文为你介绍如何通过黑白显示器上也能显示出彩色。 原来在黑白显示器上也能显示出彩色啊!通过在监视器上覆盖拜耳滤色镜,并拼接彩色图像,...

osc_jklrr90y
53分钟前
18
0
key-value结构排序:给定一个字符串,统计每个字符出现频率,先按value降序,再按key升序

对于key-value结构的排序 第一种:lambda表达式 第二种:函数 第三种:类对()的重载,仿函数形式 #include <iostream>#include <vector>#include <unordered_map>#include <string>#in......

osc_gwtkg2dc
54分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球区块链创新50强》 目录 世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛——2020全球...

osc_vew1u0h0
55分钟前
0
0
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)

BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三) 目录 2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》 演讲嘉宾 演讲内容 ...

osc_8o71811p
56分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部