【问题标题】:iOS: setting Exclusive Touch to all buttons in a viewiOS:将 Exclusive Touch 设置为视图中的所有按钮
【发布时间】:2012-08-12 04:00:35
【问题描述】:

我的应用在一个窗口中有许多按钮,我想将它们全部设置为 Exclusive Touch。你对此有什么建议吗?谢谢

【问题讨论】:

    标签: ios uibutton touch


    【解决方案1】:

    有一种方法可以为您的应用中的所有按钮设置独占触摸,可能会有所帮助。

    #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@:");
    }
    

    如果不明白,可以参考thisthis

    【讨论】:

    • @ZuzooVn 您应该在创建任何要设置独占触摸的视图之前粘贴此代码。
    【解决方案2】:

    您是否只是在寻找一种简单的方法来一次设置它们?

    如果你有一个数组中的所有按钮(例如,它们都连接到同一个 IBOutletCollection),你可以使用键值编码来设置数组的 ExclusiveTouch 属性:

    [buttonArray setValue:[NSNumber numberWithBool:YES] forKey:@"exclusiveTouch"];
    

    NSArray 然后将对数组中的每个项目调用相同的方法。

    【讨论】:

    • 它们不在数组中。是否可以在 XIB 中设置它们?
    【解决方案3】:
    -(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 调用这个函数

    【讨论】:

      【解决方案4】:

      如果这些按钮都在同一个视图中,您可以遍历视图的子视图,测试特定的子视图是否为按钮(如果有一组,则测试标签)并在每个上设置 ExclusiveTouch。

      【讨论】:

        【解决方案5】:

        我刚刚找到了答案:

        #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];
            }
        }
        

        Source

        【讨论】:

          【解决方案6】:

          如果您想为整个应用程序中的所有 UIButtons 设置 ExclusiveTouch,method swizzling 将是您的完美解决方案。

          这个答案很好地解释了方法:https://stackoverflow.com/a/24534814/976246,它对我来说非常有效。

          还可以通过本文了解this (http://nshipster.com/method-swizzling/) tecknique 如何用于各种用途。

          【讨论】:

            【解决方案7】:

            如果您实际添加按钮,请在添加到其超级视图之前为每个按钮向按钮[button setExclusiveTouch:YES]; 发送消息。否则,如果您使用的是 xib,则必须将相同的消息发送到 viewDidLoad 或 loadView 中的按钮。

            【讨论】:

              【解决方案8】:

              这里是 swift 中的一些代码,它将为您的视图控制器视图中的所有按钮设置独占触摸

              for button in self.view.subviews {
                  if(button.isKindOfClass(UIButton)){
                      (button as! UIButton).exclusiveTouch = true
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-07-03
                • 2014-08-08
                • 2011-02-15
                • 1970-01-01
                • 2012-04-06
                • 1970-01-01
                相关资源
                最近更新 更多