如何在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 中以编程方式创建视图

基于coreData信息在objective-c中以编程方式创建图像

在 Objective-C 中以动态和编程方式调整 UIView 的大小