UICollectionView 的加载机制问题

UICollectionView  子控件按钮切换背景图遇到的问题

   一,初始化自定义cell

-(instancetype)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];

 if (self) {//创建按钮,

    self.voiceButton = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *voiceImage = [UIImage imageNamed:@"语音"];

   [self.voiceButton setBackgroundImage:voiceImage  forState:UIControlStateNormal];

   [self.voiceButton addTarget:self action:@selector(pressToVoice:) forControlEvents:UIControlEventTouchUpInside];

     }

return self;

}

二,了解cell的加载机制

  UICollectionViewCell 通过初始化的时候,UICollectionViewCell 初始化的时候会给每一个cell 一个唯一的标识。当系统在创建的时候,优先从复用池中取出有相应标识的cell 进行复用。如果取出的cell 没有相对于的标识。会自动创建并分配相应的标识,以至于节约系统内存,防止重复创建以浪费系统资源和内存。


      当然这是在UICollectionViewCell 创建尺寸是整个屏幕大小的时候,所以在这样的情况下在初始化的时候系统优先初始化用户点击进去的第一个(不一定是第0个 有可能是用户点击中间位置进去的那个第一次响应的cell)这是UICollectionViewCell 初始化的机制。

  三,当滚动的时候加载和刷新机制

    当用户手动拖动cell 的时候,UICollectionViewCell 会来回的复用相应的标识,因为这是最基本的控件加载机制。如果这时候监听按钮发音完切换图片的时候,如下代码。

播放完语音的时候自动切换,对相应的cell中的按钮控件进行状态的改变

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{//默认的图片是语音,播放完过后改变背景图为语音1

[_showDetailCell.voiceButton setBackgroundImage:[UIImage imageNamed:@"语音1"] forState:UIControlStateNormal];

}

     这时你会发现按钮好像根本不好使,明明很简单的东西为什么就不好用呢,仔细的推敲一下,断点调试过后你才知道原来是UICollectionViewCell 的加载机制原理根本不是我们想的那样,所以这是问题的关键,UICollectionViewCell 在cell的尺寸正好是屏幕大小的时候你会发现当你拖动每一个cell的时候,UICollectionView会进行相应的预加载,当你拖动当前的cell的时候UICollectionViewCell 会进行预加载下一个cell,所以当你去取当前按钮让它切换背景的时候,其实当前的按钮根本不会改变,或者出先错乱。所以这里就是最大的问题。

    拖动第二个的时候预加载第三个,拖动第三个的时候预加载第四个,往前这相反,拖动第三个的是预加载第一个。所以我们往往会第一时间想法在初始化UICollectionViewCell 的时候取出当前的cell。但是UICollectionViewCell 创建的cell 是屏幕的尺寸的时候,其实UICollectionViewCell 只会初始化两次。所以在初始化方法中赋值全局的cell时候肯定就不是我们要的对象。

四,正确取出对象

  以上问题经过不断的去努力查阅资料,终于解决了这个问题。UICollectionViewCell
在滚动的时候去取出想要的对应的cell,在播放语音的时候切换图片,播放完任然按照上边的方法走,只要取出的cell 对象没错。就完美解决了

首先取出相对于的indexPath的cell

NSIndexPath *currentIndexPath = [NSIndexPath indexPathForRow:_currentIndex inSection:0];

self.showDetailCell = (ShowDetailEnemyCollectionViewCell *)[self.collecttion cellForItemAtIndexPath:currentIndexPath];

当播放语音的时候让他显示发音的图片

[_player play];

[self.showDetailCell.voiceButton setBackgroundImage:[UIImage imageNamed:@"语音"] forState:UIControlStateNormal];

执行者一系列的操作过后,再根据发音代理方法执行发音结束,此问题就完美解决了,以后的问题都是小问题,只有自己想不到的,没有自己做不到的,所以以后凡事多思考,从各个方面思考问题,多查阅资料。一定可以克服任何问题。。。。













最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • { 11、核心动画 需要签协议,但是系统帮签好 一、CABasicAnimation 1、创建基础动画对象 CAB...
    CYC666阅读 1,544评论 2 4
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,483评论 1 14
  • 聊天控制器(ChatViewController)界面搭建 14.聊天界面-工具条排版 1)搭建界面 添加聊天控制...
    夜空已沉寂阅读 3,025评论 0 4
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,412评论 0 12
  • 小东老婆生第一个女儿后,在医院里住到第三天,小东的父亲一直都未出现。小东本来也没有太注意,以为说这几天大家都很忙,...
    成不熟阅读 227评论 0 0