如何在Objective-C中以编程方式而不是由用户控制UISwitch的状态?
Posted
技术标签:
【中文标题】如何在Objective-C中以编程方式而不是由用户控制UISwitch的状态?【英文标题】:How to control the state of UISwitch programmatically and not by user in Objective-C? 【发布时间】:2018-11-24 07:21:26 【问题描述】:我有一个 UiSwitch,我想禁止它被用户打开和关闭。我想知道用户何时点击它,并根据需要以编程方式更改其状态。
此代码禁用开关但使其褪色。我不想要它,因为我希望用户点击它。
[switch setEnabled:NO];
【问题讨论】:
【参考方案1】:无论出于何种原因,您可能想要这样做,一种方法是通过在开关上添加 UIView 并为其添加一个点击识别器来处理点击,然后您可以通过编程方式将开关设置为打开或关闭。考虑下面的代码:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.switchControl = [[UISwitch alloc] initWithFrame:CGRectMake(10, 100, 0, 0 )];
[self.view addSubview:self.switchControl];
[self.switchControl setOn:YES animated:NO];
UIView *view = [[UIView alloc] initWithFrame:self.switchControl.frame];
[self.view addSubview:view];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapSwitch)];
[view addGestureRecognizer:tap];
- (void)didTapSwitch
[self.switchControl setOn:NO animated:YES];
【讨论】:
【参考方案2】:你可以这样做,主要思想是找到开关的坐标。如果您在视图中有开关,则可以改用hitTest:withEvent:
方法
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UISwitch *mySwitch;
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
self.mySwitch.userInteractionEnabled = NO;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
[super touchesEnded:touches withEvent:event];
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
if (CGRectContainsPoint(self.mySwitch.frame, touchLocation))
[self.mySwitch setOn:!self.mySwitch.isOn];
@end
【讨论】:
以上是关于如何在Objective-C中以编程方式而不是由用户控制UISwitch的状态?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective-C 中以编程方式检查协议是不是包含某些方法?
如何在Objective-C中以编程方式发送带有一些正文文本的短信[重复]
如何在 Objective-C 中以编程方式添加特定大小的 UIImageView。我也有同一个类的 xib 文件,但我不想使用它
在 Objective-C Xcode 5 中以编程方式创建视图