我的应用程序在一个窗口中有很多按钮,我想将 Exclusive Touch 全部设置在一起。你对此有什么建议吗?谢谢
8 回答
有一种方法可以为您的应用程序中的所有按钮设置独占触摸,可能会有所帮助。
#import </usr/include/objc/objc-class.h>
static IMP gOringinalWillMoveToSuperview = nil;
static id newMoveToSuperviewPlusSettingExclusiveTouch(id self,SEL selector,...)
{
va_list arg_list;
va_start( arg_list,selector);
gOringinalWillMoveToSuperview(self,selector,arg_list);
[self setExclusiveTouch:YES];
return nil;
}
-(void)addSettingExclusiveTouchToAllUIViewMethodWillMoveToSuperview
{
gOringinalWillMoveToSuperview = class_getMethodImplementation([UIButton class], @selector(willMoveToSuperview:));
class_replaceMethod([UIButton class], @selector(willMoveToSuperview:), &newMoveToSuperviewPlusSettingExclusiveTouch, "v@:");
}
-(void)setExclusiveTouchForButtons:(UIView *)myView
{
for (UIView * v in [myView subviews]) {
if([v isKindOfClass:[UIButton class]])
[((UIButton *)v) setExclusiveTouch:YES];
else if ([v isKindOfClass:[UIView class]]){
[self setExclusiveTouchForButtons:v];
}
}
}
然后在 viewDidAppear 调用这个函数
您是否只是在寻找一种简单的方法来一次设置它们?
如果您有一个数组中的所有按钮(例如,它们都连接到同一个 IBOutletCollection),您可以使用键值编码来设置数组的 ExclusiveTouch 属性:
[buttonArray setValue:[NSNumber numberWithBool:YES] forKey:@"exclusiveTouch"];
然后 NSArray 将对数组中的每个项目调用相同的方法。
我刚刚找到了一个答案:
#pragma mark Set Buttons Exclusive Touch Yes
-(void)setExclusiveTouchForButtons:(UIView *)myView
{
for (UIView * button in [myView subviews]) {
if([button isKindOfClass:[UIButton class]])
[((UIButton *)button) setExclusiveTouch:YES];
}
}
如果这些按钮都在同一个视图中,您可以遍历视图的子视图,测试特定的子视图是否是一个按钮(或者如果您有一组,则测试一个标签)并在每个上设置 ExclusiveTouch。
如果您想在整个应用程序中为所有 UIButtons 设置 ExclusiveTouch,那么swizzling将是您的完美解决方案。
这个答案很好地解释了这种方式:https ://stackoverflow.com/a/24534814/976246 ,它对我来说非常有效。
还可以通过这篇文章了解如何将这种 (http://nshipster.com/method-swizzling/)技术用于各种目的。
[button setExclusiveTouch:YES];
如果您要务实地添加按钮,请在添加到其超级视图之前向每个按钮的按钮发送消息。否则,如果您使用的是 xib,则必须将相同的消息发送到 viewDidLoad 或 loadView 中的按钮。
这是 swift 中的一些代码,它将为您的视图控制器视图中的所有按钮设置独占触摸
for button in self.view.subviews {
if(button.isKindOfClass(UIButton)){
(button as! UIButton).exclusiveTouch = true
}
}