捕捉到固定步数的UISlider(如iOS 7设置应用程序中的文本大小)

我正在尝试创建一个UISlider,它允许您从数字数组中进行选择。每个滑块位置应等距,滑块应捕捉到每个位置,而不是在它们之间平滑滑动。(这是iOS 7中引入的设置常规文本大小中滑块的行为。)

我想从中选择的数字是:-3、0、2、4、7、10和12。

(我对Objective-C非常陌生,因此完整的代码示例比代码片段更有帮助。=)

其他一些答案是有效的,但这将在滑块的每个位置之间提供相同的固定空间。在本例中,您将滑块位置视为包含您感兴趣的实际数值的数组的索引

@接口MyViewController:UIViewController{
UISlider*滑块;
NSArray*编号;
}
@结束
@MyViewController的实现
-(无效)viewDidLoad{
[超级视图下载];
slider=[[UISlider alloc]initWithFrame:self.view.bounds];
[self.view addSubview:滑块];
//这些数值表示每个滑块位置
数字[email protected][@(-3),@(0),@(2),@(4),@(7),@(10),@(12)];
//滑块值从0到数字数组中的值数
NSInteger numberOfSteps=((浮点)[数字计数]-1);
slider.maximumValue=步数;
slider.minimumValue=0;
//当滑块移动时,它将不断调用-valueChanged:
slider.continuous=YES;//NO使其仅在释放后调用
[目标:自我
操作:@选择器(值已更改:)
forControlEvents:UIControlEventValueChanged];
}
-(无效)值已更改:(UISlider*)发送方{
//将滑块位置四舍五入到数字数组的最近索引
NSUInteger索引=(NSUInteger)(slider.value+0.5);
[滑块设置值:索引动画:否];
NSNumber*number=numbers[index];//<--您需要的数值
NSLog(@“sliderIndex:%i”,(int)索引);
NSLog(@“编号:%@”,编号);
}

我希望这会有帮助,祝你好运

编辑:这里是Swift 4中的一个版本,它使用回调将UISlider子类化

类MySliderStepper:UISlider{
私有出租价值:[浮动]
私有变量lastIndex:Int?=nil
让回调:(浮动)>无效
init(frame:CGRect,values:[Float],回调:@escaping(\uNewValue:Float)->Void){
self.values=值
self.callback=回调
super.init(frame:frame)
self.addTarget(self,action:#选择器(handleValueChange(发送方:)),for:.valueChanged)
让步骤=值。计数-1
self.minimumValue=0
self.maximumValue=浮动(步数)
}
必需的初始化?(编码器aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
@objc func handleValueChange(发送方:UISlider){
让newIndex=Int(sender.value+0.5)//向上取整到下一个索引
self.setValue(Float(newIndex),动画:false)//捕捉到增量
让didChange=lastIndex==nil | | newIndex!=lastIndex!
如果你改变了{
lastIndex=newIndex
让actualValue=self.values[newIndex]
self.callback(实际值)
}
}
}

发表评论