我的应用程序在应用程序中有很多按钮
我想一次性将所有这些设置在一起。或应用中的所有观看
我们可以单独设置
[button setExclusiveTouch:YES];
但我想一次为应用程序中的所有按钮设置
我们可以设置所有视图独占触摸吗?
任何团体都有任何想法请建议我。
答案 0 :(得分:9)
最优雅且实际上设计的方法是使用appearance
代理,该代理旨在为给定的UI组件设置一个已定义的行为或外观。
[[UIButton appearance] setExclusiveTouch:YES];
有关详情,请访问:Apple Documentation - UIAppearance和NSHipster - 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类型的每个对象,应用独占触摸