ios开发sdk5.1如何实现自定义UISwitch,即改变上面的文字

ios开发sdk5.1如何实现自定义UISwitch,即改变上面的文字,第1张

如果你要自定义UIKit的控件,有两种方式:继承UISwitch进行扩展或者组合UIButton、UILabel等,

推荐使用组合。

UISwitch的机制我们只能猜测一下,默认英文的ON|OFF是UILabel,中文下你会看到是个|和O,是个UIImageview,你可以试着去屏蔽它来验证我的猜测。利用继承来自定义UISwitch会比较费事。

继承UIControl去用UIButton、UILabel组合一个Switch是较好的方式(甚至看见用UISlider的,汗)。推荐你去code4app的开关分类去下载demo研究一下,那里有2个switch的例子。

UISwitch(如下图)可以认为是其他UI库中Checkbox的替代品,但所呈现的内容更丰富,包括文本、颜色、动画。默认情况下,UISwitch的提示文本分别是ON和OFF,并很好地支持国际化以在不同区域语言下显示不同的文字,但由于无法定制导致在有些应用场景中显得不是很准确。比如在询问是否同意时希望提示文本可以是YES和NO,判断是否正确则应该是TRUE和FALSE等等。为此需要对UISwitch进行扩展。考虑到继承会导致控件继承关系太深,因此采用了Objective C的特性之一的Category。

实现的主要原理就是找到UISwitch中用于显示文本的UILabel控件并打标记以便在需要设定文本的时候访问到相应控件。

Category声明:

@interface UISwitch (CustomText)

+ (UISwitch *) switchWithLeftText: (NSString *) tag1 andRight: (NSString *) tag2

@property (nonatomic, readonly) UILabel *label1

@property (nonatomic, readonly) UILabel *label2

@end

Category实现:

#define TAG_OFFSET 900

@implementation UISwitch (CustomText)

- (void) locateAndTagAndTag: (UIView *) aView withCount:(int *) count

{

for (UIView *subview in [aView subviews])

{

if ([subview isKindOfClass:[UILabel class]])

{

*count += 1

[subview setTag:(TAG_OFFSET + *count)]

}

else

[self locatelocateAndTagAndTag:subview withCount:count]

}

}

- (UILabel *) label1

{

return (UILabel *) [self viewWithTag:TAG_OFFSET + 1]

}

- (UILabel *) label2

{

return (UILabel *) [self viewWithTag:TAG_OFFSET + 2]

}

+ (UISwitch *) switchWithLeftText: (NSString *) tag1 andRight: (NSString *) tag2

{

UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero]

int labelCount = 0

[switchView locateAndTag:switchView withCount:&labelCount]

if (labelCount == 2)

{

[switchView.label1 setText:tag1]

[switchView.label2 setText:tag2]

}

return [switchView autorelease]

}

@end

在实际应用中,实例化定制的UISwitch的代码如下:

UISwitch *switch = [UISwitch switchWithLeftText:@"YES" andRight:@"NO"]

为要更改Text的UISwitch建立IB连接:例如mySwitch,在代码中改变文字:

(( UILabel *)[[[[[[ self . mySwitch subviews ] lastObject ] subviews ] objectAtIndex :2] subviews ] objectAtIndex :0]). text = @"Foo"

(( UILabel *)[[[[[[ self . mySwitch subviews ] lastObject ] subviews ] objectAtIndex :2] subviews ] objectAtIndex :1]). text = @"Bar"


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11403420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存