【问题标题】:ios haptic feedback globally for all UIButtons所有 UIButtons 的全局 ios 触觉反馈
【发布时间】:2019-03-11 00:10:12
【问题描述】:

如何在我的应用程序中为每个 UIButton 的每个 touchupinside 事件应用触觉反馈,而无需为每个单独的按钮编写代码?我已经尝试创建一个 UIButton 类别并覆盖 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 但这会弄乱我的一些 UIButton 操作,(我可能实施得很糟糕)

有人有什么建议吗?

【问题讨论】:

    标签: ios objective-c iphone uibutton


    【解决方案1】:

    在类别中覆盖提到@ChoungTran 的此类方法并不是一个好主意。如果您想自定义 Category 中的默认方法,最好在 swizzled method 中进行。

    但是,我更喜欢创建一个从 UIButton 派生的自定义类,并在那里实现该逻辑,并在需要触觉的任何地方使用该按钮。


    来自Apple documentation

    虽然目前 Objective-C 语言允许你使用 类别来覆盖类继承的方法,甚至方法 在类接口中声明,强烈建议您不要 这样做。类别不能替代子类。有 使用类别覆盖的几个重大缺点 方法:

    当一个类别覆盖一个继承的方法时, 像往常一样,category 可以通过 a 调用继承的实现 给超级留言。但是,如果一个类别覆盖了一个方法 存在于类别的类中,没有办法调用原来的 实施。

    一个类别不能可靠地覆盖在另一个类别中声明的方法 同一类的类别。

    这个问题特别重要,因为许多 Cocoa 类是使用类别实现的。框架定义的方法 您尝试覆盖的可能本身已在某个类别中实现, 所以没有定义哪个实现优先。

    某些类别方法的存在可能会导致行为变化 跨所有框架。例如,如果您覆盖 windowWillClose:NSObject上一个类中的委托方法,所有窗口 然后程序中的委托使用类别方法进行响应;这 您的所有 NSWindow 实例的行为可能会发生变化。分类你 添加一个框架类可能会导致行为的神秘变化和 导致崩溃。

    【讨论】:

    • 此外,在您的应用中,您可能会遇到不想要触觉的情况(例如某些使用 UIButton 子类的系统警报等)。
    【解决方案2】:

    尝试将类别与 UIButton 类一起使用。在 UIButton-Extention 注册事件 forControlEvents:UIControlEventTouchUpInside

    #import "UIButton+Extention.h"
    
    @implementation UIButton (Extention)
    
    - (instancetype)init
    {
        self = [super init];
    
        if (self)
        {
            [self addTarget:self action:@selector(customTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
        }
        return self;
    }
    
    -(void)awakeFromNib
    {
        [super awakeFromNib];
    
        [self addTarget:self action:@selector(customTouchUpInside:)
                                     forControlEvents:UIControlEventTouchUpInside];
    }
    - (void)customTouchUpInside:(UIButton *)sender
    {
        //TODO:
        NSLog(@"Do something here...");
    }
    @end
    

    更新:当 UIButton 以编程方式创建时注册事件

    【讨论】:

    • 请注意,-awakeFromNib 只会为按钮调用,从 nib 加载,而不是为以编程方式创建的按钮调用。
    • @BorysVerebskyi 是的,笔尖或故事板。如果你想以编程方式创建,试试这个 - (instancetype)init { self = [super init]; if (self) { [self addTarget:self action:@selector(customTouchUpInside:) forControlEvents:UIControlEventTouchUpInside]; } 返回自我; }
    • 可以创建一个可以处理所有按钮的类别。我认为与其覆盖-awakeFromNib,不如覆盖-viewWillMoveToSuperview。但是我现在懒得检查了。
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2015-12-26
    • 2020-08-08
    相关资源
    最近更新 更多