(转)【iOS】RadioButton样式
转自:http://www.jianshu.com/p/4971424c693b
我们知道IOS是没有类似RadioButton的单选框,So 我们来看下github 上start最多的项目RadioButton-ios的实现方式。地址:GitHub - onegray/RadioButton-ios: Lightweight RadioButton class for iOS
先看效果图:
接下来我们分析下源码:
这个项目只有两个文件:RadioButton.h和RadioButton.m,先看下RadioButton.h的内容:
其实也没什么,但是有个属性就比较的特殊:groupButtons,他用了IBOutletCollection的实现方式。这个关键字,可以将界面上一组相同的控件连接到同一个数组中。通常情况下,我们使用一个IBOutletCollection属性时,属性必须是strong的,且类型是NSArray。具体想了解更多IBOutletCollection,可以参考:IBOutletCollection的使用方法 - CocoaChina_让移动开发更简单。这里用IBOutletCollection主要还是为了方便能够在IB中方便操作,其实用NSArray实现也是一样的。
RadioButton.m中最主要的方法
如果用IB方式进行组合的话,这个方法不需要你去主动调用。其实这个方法做的工作就是遍历buttons,然后通过NSValue的valueWithNonretainedObject方法将buttons设置到sharedLinks数组里面。为什么取sharedLink这个名字,主要是因为这些buttons引用的是同一个sharedLinks。之后其他的方法就是围绕着sharedLinks去操作,并通过NSValue的nonretainedObjectValue获取之前封装的值。注意:这里为什么要多此一举的用NSValue的两个方法,其实这里存在一个循环引用的问题,而NSValue的两个方法就是为了弱化这层关系,大家可以好好琢磨。
选中之后的操作会执行这几个方法,主要是设置当前RadioButton选中状态,然后循环便利其他RadioButton状态为未选中状态。如果是用IB进行操作的话,选中和未选中的状态的背景可以通过如下图方法设置:
我的步骤与代码:
1.先复制RadioButton.h和RadioButton.m到项目中
2.在storyboard中,拖拉button控件进view中,设置类为RadioButton并设置第一个button state 为Selected,这是默认选中
然后在State Config中设置Default 的 image为unchecked.png,Selected的image为checked.png
3.拉到viewcontroller.h中建立链接并创建动作,并在viewcontroller.m中#import "RadioButton.h"
@class RadioButton; @interface WifiGuestController : UIViewController @property (strong, nonatomic) IBOutlet RadioButton *reset_time_btn; @property (strong, nonatomic) IBOutlet RadioButton *extend_time_btn; - (IBAction)onRadioBtn:(RadioButton*)sender; @end
由于一次对应一个控件只能创建一个动作事件,重新回到storyboard中,打开第二个button的链接管理器,连线到Touch Up inside,选择第一个button的点击事件即可。
4.由于上文提到groupbuttons,如果不设置,RadioButtons之间的状态不会切换。
重新打开第一个button的链接管理器,找到groupbuttons,把旁边的+号连接到第二个button中即可。(第二个button不用重复设置)。