IOS复习UISlider和UISwitch
开头就不写了,和前面一样,新建项目UISlider&UISwitchStudy
本次实现的UISlider和UISwitch控件用代码实现的一些简单功能,拖动slider 在label上显示slider的值,当slider值大于90的时候,弹出一个警告;switch在变换开关的时候,实现隐藏事件:
首先在ViewController.h文件中定义三个控件对象,因为需要使用到Alert的委托方法,添加UIAlertViewDelegate协议,代码如下
@interface chenViewController : UIViewController<UIAlertViewDelegate>
{
UISlider *slider;
UILabel *sliderLabel;
UISwitch *switchTest;
}
下面就不详细写了,代码如下,都有详细注释,下次有需要补充再补充
- (void)viewDidLoad
{
[superviewDidLoad];
CGRect frame = CGRectMake(10, 50, 200, 0);
//slider高度被忽略,所以设置为0
slider=[[UISlider alloc] initWithFrame:frame];
//slider系统默认取值范围是0.0--1.0之间,可以通过mininumValue和maxinumValue两个属性设置
slider.minimumValue=0.0;
slider.maximumValue = 100.0;
//设置滑块左边值颜色为绿色。系统默认为蓝色
slider.minimumTrackTintColor = [UIColorgreenColor];
//设置滑块右边值为红色,系统默认为白色
slider.maximumTrackTintColor = [UIColorredColor];
//给slider是指默认值30
slider.value = 30;
//continuous属性,是指滑块值在拖地触发滑块值变动
slider.continuous = YES;
[slideraddTarget:selfaction:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:slider];
//实例label
sliderLabel=[[UILabelalloc]initWithFrame:CGRectMake(200, 200, 80, 45)];
[self.viewaddSubview:sliderLabel];
//Switch控件,
CGRect switchFrame = CGRectMake(100, 200, 0, 0);
//初始化
switchTest = [[UISwitch alloc] initWithFrame:switchFrame];
//设置switch初始状态为ON
switchTest.on = YES;
//添加一个触发事件,当点击时候,触发这个事件
[switchTestaddTarget:selfaction:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:switchTest];
}
//触发事件是弹出一个警告,当滑块值大于90的时候,这个事件才被触发,想在此处提的一点是Alert多个按钮时,怎样去调用其他事件的发生,此处就用到了Alert的委托方法;
-(void)sliderValueChanged:(id)sender
{
UISlider *sliderValueChange = (UISlider *)sender;//做一个类型装换
if (sliderValueChange==slider) {
float value = sliderValueChange.value;
slider.value =value;
NSLog(@"%f",value);
sliderLabel.text = [NSString stringWithFormat:@"%.2f",slider.value];
NSLog(@"------%@",sliderLabel.text);
//当slider滑条值大于90的时候,弹出警告
if (sliderValueChange.value>=90) {
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"警告" message:@"滑动条值高达90了" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles:@"返回初始位置", nil];
[alert show];
}
}
}
//Alert的委托方法,用buttonIndex按钮索引值代表按钮,处理按钮事件
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex==0) {
NSLog(@"知道了");
}
elseif (buttonIndex==1){//点击了返回初始位置按钮事,重新h设置按钮的值未初始化时候的值
slider.value=30;
//将slider值转换成字符串赋给text
sliderLabel.text=[NSString stringWithFormat:@"%.2f",slider.value];
}
}
//触发事件的方法,可以在里面添加其他代码
-(void)switchValueChanged:(id)sender
{
if (switchTest.on == YES)
{
// switchTest.hidden=YES;//隐藏
NSLog(@"开");
}
else {
//switchTest.on = YES;
NSLog(@"关");
}
}
下面是来源于互联网
本想着设置switch的标题,但是网上的在网上看人家博客的方法是改写 UISwitch.h和.m里的文件,UICUstomSwitch.h和.m继承UISwitch方法,别人有写写好的文件可以直接添加到工程之中,但是在ViewDidLoad中去不能访问UICustomSwitch里面的方法,不知道什么原因,SSDViewContoller中也加入了 UICUstomSwitch.h头文件,可还是提示没有他里面的方法错误信息:
No visible @interface for 'UISwitch' declares the selector 'setLeftLabelText:font:color:'
这种方法参考的:http://www.flyblog.info/catprogramming/258.html
还查出一种方法是
((UILabel *)[[[[[[switchTest subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:0]).text = @"Foo";
((UILabel *)[[[[[[switchTest subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:1]).text = @"Bar";
但是运行就出现类存问题,数组越界什么的;运行错误;
这种方法参考的:http://www.cnblogs.com/xingchen/archive/2011/11/07/2240225.html
如果有懂的大哥大姐们还望你们给予指点;
原文转载:http://blog.csdn.net/banyingli/article/details/6167561
#pragma mark -test
#pragma mark test
这两行是注释,方便查找,夹在方法前面,。。
今天就写到这儿了,
2013年8月7日,11:48,东南大学无锡分校桃园3宿舍106室
补充
这是拖拽空间实现的
这是输出口和事件
@property (weak, nonatomic) IBOutletUILabel *sliderLabel;
- (IBAction)sliderChanged:(id)sender;
这是事件实现
- (IBAction)sliderChanged:(id)sender {
//首先将sender装换承UISlider,作用是让代码可读性变强,
//并避免每次使用sender都对他进行其它类型转换。
UISlider *slider = (UISlider *)sender;
//接收滑块的值,将其加0.5,以便四舍五入为整型值。
int progresAsInt = (int)(slider.value +0.5f);
//必须转换为string 时间上一个项目里面有
self.sliderLabel.text =[[NSString alloc] initWithFormat:@"%d",progresAsInt];
}
然后就ok
补充另外一点
// 两端添加图片
// 滑块可以在任何一段显示图像。添加图像后会导致滑动条缩短,所以记得要记得在创建的时候增加滑块的宽度来适应图像。
// [ mySlider setMininumTrackImage: [ UIImage applicationImageNamed:@"min.png" ] forState: UIControlStateNormal ];
// [ mySlider setMaxinumTrackImage: [ UIImage applicationImageNamed:@"max.png" ] forState: UIControlStateNormal ];
// 你可以根据滑块的各种不同状态显示不同的图像。下面是可用状态:
// UIControlStateNormal
// UIControlStateHighlighted
// UIControlStateDisabled
// UIControlStateDisabled
// UIControlStateSelected
//continuous属性,是指滑块值在拖地触发滑块值变动
mySlider.continuous = YES;
//滑块值改变时收到通知
[mySlider addTarget:selfaction:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:mySlider];
//[self.navigationItem.titleView addSubview:myslider ];//添加到导航栏
}
这句代码需要思考一下转换字符串的方式
//只要滑块停放(注意是停放,如果要在拖动中也触发,请看后文)到新的位置,你的动作方法就会被调用:
- (void) sliderValueChanged:(id)sender{
UISlider *control=(UISlider *)sender;
if (control==self.mySlider) {
//float value=control.value;//读取控件值
self.sliderLabel.text=[NSString stringWithFormat:@"%0.2f",self.mySlider.value];
}
}
//如果要在拖动中也触发,需要设置滑块的 continuos 属性:
//mySlider.continuous = YES ;
//这个通知最简单的一个实例就是实时显示滑块的值,很奇怪的苹果显示滑块的值是一个私有的API(setShowValue),私有就私有,大不了我不用就是。我们可以用一个UILabel来显示值,在每次触发上面的方法时改变label的值,不就可以实时显示了吗?当然我们可以做的不仅仅是这个,还有更多的 cool 事情可以去实现,就看你的手段与想象力了。