响应者对于接收到的事件有下列操作: 不拦截,默认操作,事件会自动沿着默认的响应链往下传递; 拦截,不再往下分发事件,重写 touchesBegan 进行事件处理,不调用父类的 touchesBegan;...拦截,继续往下分发事件,重写 touchesBegan 进行事件处理,同时调用父类的 touchesBegan 将事件往下传递; 如果最终没有响应者响应事件,则事件被丢弃。...响应链-方法调用 ParentView是TapTestView的父 View,TapTestView没有重写touchesBegan 方法,在ParentView的touchesBegan 方法中打上断点...,点击TapTestView区域,相关函数调用如上图所示,可以看出先调用了TapTestView的touchesBegan方法,然后接着调用了ParentView的touchesBegan 方法。...,当手势识别失败时才开始调用 touchesBegan 函数。
sender: Any) { let uname = username.text let upwd = password.text // 可以在这里对输入的信息进行判断...)件商品" } if value == stepper.minimumValue { product.text = "您未购买任何商品...override func viewDidLoad() { super.viewDidLoad() } override func touchesBegan(_ touches...NSCollectionLayoutAnchor 在 Item 中,可能需要给其加上小红点或者未读消息数等附加视图,在 UICollectionViewCompositionalLayout 中,可以通过...创建UICollectionView 为 UICollectionView 配置 List 式的布局,还可以配置滑动菜单。
Section的上左下右的边距(UIEdgeInsets) 3.给UICollectioinView设置多选 4.处理Cell的高亮事件 5.处理Cell的选中事件 6.调整Cell的上下左右边距 7.对Cell...我们可以创建两个UICollectionReusableView的子类,一个是Header View, 另一个是Footer View。...这里我们是从xib文件来加载的Supplementary View, 先创建两个UICollectionReusableView子类,在创建该子类的同时创建相应的xib文件,如下所示: ?...Objective-C /** * 如果Cell可以高亮,Cell变为高亮后调用该方法 */ - (void)collectionView: (UICollectionView *)...,具体信息请看下方代码实现: Objective-C /** * Cell将要出现的时候调用该方法 */ - (void)collectionView:(UICollectionView
3.给UICollectioinView设置多选 4.处理Cell的高亮事件 5.处理Cell的选中事件 6.调整Cell的上下左右边距 7.对Cell...我们可以创建两个UICollectionReusableView的子类,一个是Header View, 另一个是Footer View。...这里我们是从xib文件来加载的Supplementary View, 先创建两个UICollectionReusableView子类,在创建该子类的同时创建相应的xib文件,如下所示: ?...1 /** 2 * 如果Cell可以高亮,Cell变为高亮后调用该方法 3 */ 4 - (void)collectionView: (UICollectionView *)collectionView...Button的选中状态,下面是Cell在选中时以及取消选中时所调用的方法: 1 /** 2 * Cell选中调用该方法 3 */ 4 - (void)collectionView: (UICollectionView
的精髓 Layout决定了UICollectionView是如何显示在界面上的。...在展示之前,一般需要生成合适的UICollectionViewLayout子类对象,并将其赋予CollectionView的collectionViewLayout属性。...shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 另外需要了解的是,在初始化一个UICollectionViewLayout实例后,会有一系列准备方法被自动调用...首先,-(void)prepareLayout将被调用, 默认下该方法什么没做,但是在自己的子类实现中 ,一般在该方法中设定一些必要的layout的结构和初始需要的参数等。...之后,-(CGSize) collectionViewContentSize将被调用, 以确定collection应该占据的尺寸。注意这里的尺寸不是指可视部分的尺寸,而应该是所有内容所占的尺寸。
UIScrollView 恐怕是所有 App 都绕不过去的类——尤其是它的子类 UITableView 和 UICollectionView。...下图是对这几个关键词的说明: [image] 2....当用户滑动列表的时候,如果 reuseIdentifier 不为 nil,UITableView 会自动去调用已经生成好的UITableViewCell 来展示内容。...所以我们首先要做的就是创建一个该抽象类的子类,然后将其设定为当前 UICollectionView 的 Layout。...网上对于瀑布流有很多实现,大家不妨借鉴的同时,亲自动手,以加深对 UICollectionView 的理解。 访问我的Github仓库查看更多精彩分享
前言 iPhone拥有很好的用户交互体验,这源于iOS系统对交互事件的高效处理和高优响应; App开发者处理用户交互非常便捷,这源于iOS系统和UIKit对用户操作做了封装和默认处理; 本文围绕iOS...UIWindow是UIView的子类,UIView的hitTest方法实现和上述过程一致。 思考: UIView在调用子视图hitTest时,是先调用哪些子视图?...UIWindow的sendTouchesForEvent:方法调用的是我们熟悉的touches四大方法: -touchesBegan:withEvent: -touchesMoved:withEvent...手势处理的发生时机我们可以通过手势的touchesBegan:withEvent:方法来看,当我们断点在手势的touchesBegan方法时,我们看到堆栈: ?...当手势的touchesBegan:withEvent:处理完成之后,便会触发目标视图的touchesBegan方法。
标准的UICollectionView包含三个部分,它们都是UIView的子类: • Cells 用于展示内容的主体,对于不同的cell可以指定不同尺寸和不同的内容,这个稍后再说 • Supplementary...Views 追加视图 如果你对UITableView比较熟悉的话,可以理解为每个Section的Header或者Footer,用来标记每个section的view • Decoration Views...在展示之前,一般需要生成合适的UICollectionViewLayout子类对象,并将其赋予CollectionView的collectionViewLayout属性。...dequeueReusableCellWithReuseIdentifier: kInfoCollectionCellIdentifier forIndexPath: indexPath]; 在dequeueReusableCell方法中,程序会调用...而不用像笔者一样去画蛇添足地实现一个-(instancetype) initWithFrame: (CGRect) frame WithVM:(HJInfoCellVM *) vm方法,后面这个方法永远也调用不到
forDecorationViewOfKind elementKind: String) 通常情况下,在需要用到装饰视图的时候,都会去重写 UICollectionViewFlowLayout,然后在它的子类中去注册装饰视图...添加手势后,根据手势提供的三种状态,分别调用上面的四个方法,来实现拖拽排序;另外,既然 Cell 的顺序会被调整,那我们还得及时的更新数据源,来保证视图刷新后,导致拖拽的结果被还原,具体实现代码如下:...最后,我们来看下最终效果: 最后 关于 UICollectionView 系列的整理,到今天就要短暂的划上一个句号了,在写这个系列之前,我对 UICollectionView 的想法就是:无非就是比...但当我真正的去整理它的一些技术点时,我发现它实在是太灵活了,以前觉得追加视图,装饰视图这些东西很简单,几行代码的事情,但事实上,当你想要去实现一些高度自定义的界面的时候,你才会认识到自己的不足,你并没有对这些知识有更深层次的认知...,只有再你自己慢慢实现后,你内心才会感慨 "哦, 原来这些 API 可以这样调用,原来这个东西是这样的啊"。
如果我想要在用户点击后立即运行代码,我就不得不自己写一个好的UIButton子类,这样我就可以重写一些方法,即 -touchesBegan:withEvent: 和 -touchesEnded:withEvent...有了子类,我就可以塞一些自己的代码来在这些方法启动的时候运行。来看看DTCTestButton的实现文件,这是我们的按钮子类,会为我们处理一些魔法。...当子类化一个苹果提供的对象,比如UIButton时,做一个好的城市居民并确保调用super的关于这些方法的实现是很重要的,因为我们不知道苹果在这两个方法中需要运行什么代码,而且不想破坏按钮的默认行为。...我们调用super后,就可以在这两个方法中添加任何我们想要的行为。 让我们添加一个Pop动画到 -touchesBegan:withEvent:中去。...// 当用户开始点击时立即调用 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 看动画是否已经被添加到视图或者
平常我在业务开发中,绝大部分情况都是使用的UITableView,而UICollectionView则是在极少情况下才会去使用,这就导致了我对UICollectionView略感陌生。...本篇文章就是以二者对比的方式对UICollectionView做一个小总结。...UICollectionView的collectionCell支持横向&纵向布局,比UITableView的tableCell只有纵向布局要更加灵活。...UICollectionView和UITableView有相同的API设计理念——都是基于dataSource以及delegate驱动的。...它是系统为我们提供的继承自UICollectionViewLayout的用于流式布局的layout,如果我们想要实现一个自定义的布局,那么就新建一个继承自UICollectionViewLayout的子类
// UIView是UIResponder的子类,可以覆盖下列4个方法处理不同的触摸事件 // 一根或者多根手指开始触摸view,系统会自动调用view的下面方法 - (void)touchesBegan...,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象 重写以上四个方法,如果是处理UIView的触摸事件。...我们只能通过子类继承父类,重写子类方法的方式处理UIView的触摸事件(注意:我说的是UIView触摸事件而不是说的 UIViewController的触摸事件)。...touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent...2.UIApplication会从事件对列中取出最前面的事件(此处假设为触摸事件A),把事件A传递给应用程序的主窗口(keyWindow)。
查阅苹果的文档可以得知,UICollectionView 的布局是抽象类 UICollectionViewLayout 的子类,它定义了 UICollectionView 中每个 item 的布局属性叫做...:UICollectionViewLayoutAttributes,所以我们可以通过继承 UICollectionViewLayout,然后对每个 item 的 UICollectionViewLayoutAttributes...的布局过程,它与布局对象之间的关系是一种协作的关系,当 UICollectionView 需要一些布局信息的时候,它会去调用布局对象的一些函数,这些函数的执行是有一定的次序的,如图所示: 所以我们继承自...UICollectionViewLayout 的子类必须要实现以下方法: override var collectionViewContentSize: CGSize {...}...这里我的策略就是通过追踪计算每一列的高度值来得出最小高度的那一列,由于已知当前有最小高度的那一列的高度值以及索引值,那我们就可以为一个 Cell 计算得出它新的 X 坐标 和 Y 坐标,然后重新对该 Cell
2.在继承中,子类执行父类替换的方法会出现问题。 3.函数的替换必须依靠_cmd参数。 4.可能会出现命名冲突。...二、RSSwizzle的使用 RSSwizzle中提供了两种使用方式,一种是通过调用类方法来实现函数的替换,另一种是使用RSSwizzle定义的宏来进行函数的替换。...RSSwizzleModeAlways = 0, //相同key标识的替换操作只会被执行一次 RSSwizzleModeOncePerClass = 1, //相同key标识的替换操作在子类父类中只会被执行一次...*/ RSSwizzleInstanceMethod(NSClassFromString(@"ViewController"),NSSelectorFromString(@"touchesBegan...event), RSSWReplacement({ NSLog(@"test Swizzle"); }), RSSwizzleModeAlways, @"key"); 在宏内,可以直接调用
前言 iOS UICollectionView 从右向左对齐(Aligning right to left on UICollectionView) 实现原理:采用setTransform对其进行水平翻转...在这里插入图片描述 I 、UICollectionView 从右向左对齐 本文按钮的视图结构 bottomV 内部采用UICollectionView进行布局。...UICollectionViewCell内部包含子视图自定义按钮ERPbtn4Radius 1.1 核心步骤 首先,在创建UICollectionView时,对其进行了水平翻转: [_...上从右向左对齐(Aligning right to left on UICollectionView) //1、首先,在创建UICollectionView时,我对其进行了水平翻转:...//2、然后子类 UICollectionViewCell 在这里执行在其contentView上进行相同的水平翻转: //[self.contentView setTransform:CGAffineTransformMakeScale
pointInside方法对点击点进行是否在当前视图bounds内进行判断,如果超出bounds,hitTest则返回nil。...未超出范围则进行步骤3 3.对当前视图下的subviews采取逆序上述1 2步骤查询最优响应视图。...点击BView 响应者链 介绍响应者链之前先介绍下响应者对象 响应者对象:是可以响应事件并对其进行处理的对象。...,然后在调用hitTest: withEvent:依次获取处理这个事件的所有视图对象,在获取所有的可处理事件对象后,开始调用这些对象的touches回调方法 在自定义View中重写 touchesBegan...由于这些方法是事件进入应用程序的通道,所以,您可以从UIApplication或UIWindow派生出子类,重载其sendEvent:方法,实现对事件的监控或执行特殊的事件处理。
initialize方法的调用遵循继承规则(所谓继承规则,简单来讲是指:子类方法中可以调用到父类的同名方法,即使没有调用[super xxx])。...【必须】所有secondary 初始化方法都应该调用designated 初始化方法。 【必须】所有子类的designated初始化方法都要调用父类的designated初始化方法。...使这种调用关系沿着类的继承体系形成一条链。 【必须】如果子类的designated初始化方法与超类的designated初始化方法不同,则子类应该覆写超类的designated初始化方法。...(因为开发者很有可能直接调用超类的某个designated方法来初始化一个子类对象,这样也是合情合理的,但使用超类的方法初始化子类,可能会导致子类在初始化时缺失一些必要信息)。...【必须】如果超类的某个初始化方法不适用于子类,则子类应该覆写这个超类的方法,并在其中抛出异常。 【必须】禁止子类的designated初始化方法调用父类的secondary初始化方法。
一 主控制器为UITableViewController或其子类 首先,有一个很简单的解决方案,就是将我们的控制器换成UITableViewController或其子类,UITableViewController...然而,避免将HUD添加到具有复杂视图层次结构的某些UIKit视图(如UITableView或UICollectionView)是一个好主意。...此外,当用户点击【clear/清除】按键时调用 textFieldShouldClear: 方法清除内容,当用户点击【return/完成】按键时调用 textFieldShouldReturn: 方法,...*)textField { 97 [textField resignFirstResponder]; 98 return YES; 99 } 100 101 @end 2.3 对自定义...toView:nil]; if (_contentStartEditBlock) { _contentStartEditBlock(frame); } } 主控制器中对自定义
写在开头 大家早上好,今天我又给大家带来了一篇关于 UICollectionView 系列的文章,在上一篇文章中,我们实现了一个酷炫的瀑布流布局,带大家初步的了解了在 UICollectionView...但是上一篇中实现的自定义布局稍显简单,只能说是比较粗略的计算了下布局各个 item 的位置,搞明白了继承自 UICollectionFlowLayout 子类它需要重载的方法的意义,那么今天这篇文章我们就来实现一个更加复杂的自定义布局...第二步,要实现 Cell 随 UICollectionView 滚动时具有缩放效果,就需要找一个合适的时机对 Cell 进行缩放,我的思路是先计算出 UICollectionView 整体滚动内容的中心点的...读过我前几篇 UICollectionView 系列的小伙伴们,不知道你们还有没有印象,我写过一篇教程叫做 "使用 UICollectionView 实现分页滑动效果" 这里附上链接(使用 UICollectionView...bounds.width / 2 // 3.根据当前的滚动,对每个 cell 进行相应的缩放 attributes?.
——QQ 316045346 欢迎交流 一、MJRefresh源码结构分析 MJRefresh主要为UIScrollView,UITableView和UICollectionView添加头部和尾部刷新控件...其主要是为了方便MJRefresh库自己的调用,当然你也可以对它进行使用。...当UIScrollView有偏移量或内容尺寸的变化时,MJRefreshComponent会调用scrollViewContentOffsetDidChange函数,这个函数主要交给其子类实现。 ...首先MJRefreshComponent类抽象出了回调与刷新函数,并且提取出了需要子类复写的通用的布局、监听等函数,让子类的结构非常统一。...再子类则专注与实现子类自身的UI与功能。
领取专属 10元无门槛券
手把手带您无忧上云