#UIButton更换图片或者文字闪动的解决bash
在咱们作开发的时候,或多或少的会使用UIButton,且可能会较频繁的更换图片或者文字 简单的举几个例子, 1.在咱们写登陆或者注册等页面的时候,可能会须要些一个倒计时的按钮,不断的更新时间, 2.在某一个tableview或者collectionView中,某些cell中会有按钮控件 3.咱们写某些支付界面,可能选择某一个金额的时候,对应下面的支付按钮就会更换文字,好比支付XXX元... ... 因此,对于这些小需求的实现,咱们其实会有不少的实现方式, 不管是使用UIButton,或者是UILabel,... 亦或者是使用自定义的继承UIView,或者UIControl等控件,其实均可以很轻松的完成动画
在这里咱们只说使用UIButton的状况 那么细心的同窗是否会发现,在咱们使用UIButton的时候,咱们会发现更换图片或者文字的时候图片或者文字会发生闪动的状况? 相似这样的 ui
这种状况很容易复现, 1.UIButton的样式是system样式(不是custom) 2.已经有文字或者图片的状况下更换文字或者图片spa
好比咱们的写一个倒计时按钮,无非就是使用一个按钮,而后不停的间隔1秒钟更换button的文字便可. 这里咱们若是使用UIButton的话咱们须要有取舍, 1.使用system的样式的话,在咱们点击的状况下会有点击的变灰的效果,会让咱们有一个按下的反馈的感受,而使用custom则不会有这样的状况,你按下不会有什么反应,除非你定义按下的效果,这样的话代码相对会不少.且不容易达到system样式的按下效果. 2.使用system样式的咱们却会纠结于每秒更换一次文字的时候按钮的闪动效果, 这是咱们特别不想看到的.使用custom则没有闪动的效果,3d
因此,咱们可否很简单简单的结合呢? 既有按钮点击的按下变暗的反馈效果,也有更换文字不闪动的效果.且使用最小的代码量?code
三个方案 1.使用system样式,解决闪动 2.使用custom样式,解决按下反馈效果 3.使用自定义控件替代orm
这里简单的构思一下,使用自定义控件替代的话,等于彻底抛弃UIButton,这样咱们既要实现按钮的效果,也要实现按钮的点击....复杂难度最高 使用custom样式的话,跟上面说的同样,按钮的点击效果,咱们经过nomal,select等状态来修改不一样的样式,咱们可能会须要写不少冗余的代码,只是为了实现点击的效果,并且尚未system的天然 因此最终,我仍是选择system的样式,咱们仅仅须要让他不闪动就行了cdn
达到不闪动的效果其实相似这样 blog
self.button.titleLabel.text = string;
复制代码
是的,仅仅须要一行便可 可是并非在任何地方添加均可以 该行代码仅仅能添加在一个位置才有效果继承
self.button.titleLabel.text = string;
[self.button setTitle:string forState:UIControlStateNormal];
复制代码
是的就是这样,在咱们一般设置按钮文字的方法上加上这一行便可,必需要在其前一行,
一样的,若是咱们的按钮上面有图片,图片也发生闪动的话,原理也是同样,防止闪动,只须要
self.button.imageView.image = image;
[self.button setImage:image forState:UIControlStateNormal];
复制代码
基础这两行代码不能分开写,若是分开好比这样写
self.button.titleLabel.text = string;
self.button.imageView.image = image;
[self.button setTitle:string forState:UIControlStateNormal];
[self.button setImage:image forState:UIControlStateNormal];
复制代码
就不会有效果!!!!
必需要连载一块儿写,且写在各自的设置的前面
//防止文字闪动
self.button.titleLabel.text = string;
[self.button setTitle:string forState:UIControlStateNormal];
//防止图片闪动
self.button.imageView.image = image;
[self.button setImage:image forState:UIControlStateNormal];
复制代码
是的就是这么简单,就能处理闪动的效果
你可能会不屑一顾,感受这个没有什么有用的效果.
下面是我最近的一个项目, 首页是一个collectionView 内部的cell由于某些缘由就是一个按钮(这里不解释).,而后我就会在刷新collectionView的时候发生闪动的状况,
[UIView performWithoutAnimation:^{
[self.collectionView reloadData];
}];
复制代码
刚开始我也这么认为,也这么作了,可是结果是我失望了,刷新的时候仍然有闪动, 而当我将上面的cell用原来的button的部分更换成imageView和lable的组合的时候则不会闪动了, 因此闪动的状况就是由于按钮形成的, 咱们不能由于按钮闪动而放弃按钮,或者这里可能适合,可是某些地方咱们仍然可能须要按钮的使用,因此
只须要巧妙的添加两行代码便可,也就是上面介绍的防止闪动的代码
瞬间,一切都好了
在这里我也就把这个小技巧分享给你们,或许你没有遇到过这样的问题,可是当你遇到的时候,若是你知道简单的两行便可解决,不是更好吗?