按钮点击的延迟处理

#import "UIButton+touch.h"
#import <objc/runtime.h>
@interface UIButton()
/**bool 类型   设置是否执行点UI方法*/
@property (nonatomic, assign) BOOL isIgnoreEvent;
@end
@implementation UIButton (touch)
+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SEL selA = @selector(sendAction:to:forEvent:);
        SEL selB = @selector(mySendAction:to:forEvent:);
        Method methodA =   class_getInstanceMethod(self,selA);
        Method methodB = class_getInstanceMethod(self, selB);
       BOOL isAdd = class_addMethod(self, selA, method_getImplementation(methodB), method_getTypeEncoding(methodB));
        if (isAdd) {
            class_replaceMethod(self, selB, method_getImplementation(methodA), method_getTypeEncoding(methodA));
        }else{
            method_exchangeImplementations(methodA, methodB);
        }
    });
}
- (NSTimeInterval)timeInterval
{
    return [objc_getAssociatedObject(self, _cmd) doubleValue];
}
- (void)setTimeInterval:(NSTimeInterval)timeInterval
{
    objc_setAssociatedObject(self, @selector(timeInterval), @(timeInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
}
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
    if ([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {
        if (self.isIgnoreEvent == 0) {
            self.timeInterval =self.timeInterval ==0 ?defaultInterval:self.timeInterval;
        };
        if (self.isIgnoreEvent) return;
        if (self.timeInterval > 0)
        {
            self.isIgnoreEvent = YES;
            [self performSelector:@selector(setIsIgnoreEvent:) withObject:@(NO) afterDelay:self.timeInterval];
        }
        
    }
    [self mySendAction:action to:target forEvent:event];
    
}
- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{
    objc_setAssociatedObject(self, @selector(isIgnoreEvent), @(isIgnoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isIgnoreEvent{
    return [objc_getAssociatedObject(self, _cmd) boolValue];
}
@end

### 实现点击按钮延迟显示物体的功能 在 Unity 中实现点击按钮延迟显示物体的功能,可以通过使用 `Invoke` 方法或协程(Coroutine)来完成。以下是两种方法的详细说明和代码示例: #### 方法一:使用 `Invoke` `Invoke` 是 Unity 提供的一个简单方法,用于在指定的时间后调用某个函数。可以将显示物体的逻辑封装在一个函数中,并通过 `Invoke` 延迟执行。 ```csharp using UnityEngine; using UnityEngine.UI; public class DelayShowObject : MonoBehaviour { public GameObject objectToDisplay; // 要显示的物体 public Button button; // 点击按钮 public float delayTime = 2f; // 延迟时间 void Start() { if (button != null) { button.onClick.AddListener(OnButtonClick); } } void OnButtonClick() { Invoke("ShowObject", delayTime); // 延迟指定时间后调用 ShowObject 函数 } void ShowObject() { if (objectToDisplay != null) { objectToDisplay.SetActive(true); // 显示物体 } } } ``` 上述代码中,当按钮点击时,`OnButtonClick` 方法会被触发,并通过 `Invoke` 在指定的延迟时间后调用 `ShowObject` 方法[^1]。 #### 方法二:使用协程(Coroutine) 协程是 Unity 中一种更灵活的方式来处理延迟操作。以下是一个使用协程实现相同功能的示例: ```csharp using UnityEngine; using UnityEngine.UI; public class DelayShowObjectCoroutine : MonoBehaviour { public GameObject objectToDisplay; // 要显示的物体 public Button button; // 点击按钮 public float delayTime = 2f; // 延迟时间 void Start() { if (button != null) { button.onClick.AddListener(OnButtonClick); } } void OnButtonClick() { StartCoroutine(DelayedShow()); // 启动协程 } IEnumerator DelayedShow() { yield return new WaitForSeconds(delayTime); // 等待指定的时间 if (objectToDisplay != null) { objectToDisplay.SetActive(true); // 显示物体 } } } ``` 在上述代码中,`OnButtonClick` 方法启动了一个协程 `DelayedShow`,该协程会在等待指定的时间后执行显示物体的逻辑[^2]。 #### 注意事项 - 确保 `objectToDisplay` 和 `button` 在 Inspector 面板中正确赋值。 - 如果需要隐藏物体,可以在逻辑中添加 `objectToDisplay.SetActive(false)`。 - 使用 `Invoke` 或协程时,确保对象未被销毁,否则可能会导致错误。 ### 总结 通过 `Invoke` 或协程,可以轻松实现点击按钮延迟显示物体的功能。选择哪种方法取决于具体需求和个人偏好。如果需要更复杂的逻辑控制,推荐使用协程[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值