objective c如何为整个应用程序上的所有UI按钮设置独占触摸

时间:2014-06-11 08:16:55

标签: ios iphone objective-c uibutton

我的应用程序在应用程序中有很多按钮

我想一次性将所有这些设置在一起。或应用中的所有观看

我们可以单独设置

[button setExclusiveTouch:YES];

但我想一次为应用程序中的所有按钮设置

我们可以设置所有视图独占触摸吗?

任何团体都有任何想法请建议我。

5 个答案:

答案 0 :(得分:9)

最优雅且实际上设计的方法是使用appearance代理,该代理旨在为给定的UI组件设置一个已定义的行为或外观。

[[UIButton appearance] setExclusiveTouch:YES];

有关详情,请访问:Apple Documentation - UIAppearanceNSHipster - UIAppearance

答案 1 :(得分:8)

你可以试试这个

// Not tested
for (UIView * button in [myView subviews]) {
    if([button isKindOfClass:[UIButton class]])
        [((UIButton *)button) setExclusiveTouch:YES];
}

答案 2 :(得分:6)

如果您真的想在整个应用程序中为所有UIButtons +子类设置exclusiveTouch而不只是单个视图,则可以使用method swizzling

您使用objc运行时覆盖willMoveToSuperview并在那里设置独占触摸。 这是非常可靠的,我使用这种技术从未遇到任何问题。

我喜欢这样做UISwitch,因为交换机的触摸处理可能有点棘手,exclusiveTouch有助于避免因不同交换机上的同时点击而导致的错误

从上面的链接中取样并进行更改,以便设置exclusiveTouch

#import <objc/runtime.h>


@implementation UIButton (INCButton)

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];

        SEL originalSelector = @selector(willMoveToSuperview:);
        SEL swizzledSelector = @selector(inc_willMoveToSuperview:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (void)inc_willMoveToSuperview:(UIView *)newSuperview
{
    // This is correct and does not cause an infinite loop!
    // See the link for an explanation 
    [self inc_willMoveToSuperview:newSuperview];

    [self setExclusiveTouch:YES];
}

@end

创建一个类别,并为要更改的每个类插入此代码。

答案 3 :(得分:6)

为什么这么难?制作一个类别

@implementation UIButton (ExclusiveTouch)

- (BOOL)isExclusiveTouch
{
    return YES;
}

@end

答案 4 :(得分:0)

循环浏览最顶层视图的子视图(递归),对于UIButton类型的每个对象,应用独占触摸