【问题标题】:How to hide info button in ZBar Bar Code Reader for iOS6.0 and aboveiOS6.0及以上的ZBar条码阅读器如何隐藏信息按钮
【发布时间】:2013-05-03 07:08:07
【问题描述】:

我在我的 iOS 应用中使用适用于 iOS 5.0 及更高版本的 ZBar 条码阅读器。

我在相机界面上使用以下代码隐藏了信息按钮。

UIView * infoButton= infoButton = [[[[[reader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews] objectAtIndex:2];
[infoButton setHidden:YES];

但不知何故,此代码不适用于 iOS6.0 及更高版本。

【问题讨论】:

    标签: iphone ios objective-c xcode zbar-sdk


    【解决方案1】:

    试试这个代码,它在 iOS5.0 及更高版本上对我有用。

    float currentVersion = 5.1;
    float sysVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    
    UIView * infoButton;
    if (sysVersion > currentVersion)
       infoButton = [[[[[reader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
    else
       infoButton = [[[[[reader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews] objectAtIndex:2];
    [infoButton setHidden:YES];
    

    解释。 在 iOS 6.0 中,如果您打印日志。

    NSLog(@"%@",[[[[reader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews]);
    

    输出。

    "<_UIToolbarBackground: 0xa0991c0; frame = (0 0; 320 54); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0xa0795e0>>",
    "<UIImageView: 0xa05d630; frame = (0 -3; 320 3); opaque = NO; autoresize = W+BM; userInteractionEnabled = NO; layer = <CALayer: 0xa05cfb0>>",
    "<UIToolbarTextButton: 0xa0a8cc0; frame = (6 0; 60 54); opaque = NO; layer = <CALayer: 0xa0a9460>>",
    "<UIButton: 0xa0960e0; frame = (290 18; 18 19); opaque = NO; layer = <CALayer: 0xa0615a0>>
    

    在 iOS 5.0 中,如果您打印日志。

    NSLog(@"%@",[[[[reader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews]);
    

    输出。

    "<_UIToolbarBackground: 0x8d9df90; frame = (0 0; 320 54); userInteractionEnabled = NO; layer = <CALayer: 0x8dc12c0>> - (null)",
    "<UIToolbarTextButton: 0x8de5ae0; frame = (6 0; 60 54); opaque = NO; layer = <CALayer: 0x8de5db0>>",
    "<UIButton: 0x8d1b110; frame = (290 18; 18 19); opaque = NO; layer = <CALayer: 0x8dba2b0>>"
    

    因此对于 iOS 6.0 及更高版本,它应该是索引 3 处的对象,因为有一个额外的视图 UIImageView

    【讨论】:

    • 请注意,在 iOS 10 上(至少在测试版上)它再次发生了变化。现在按钮位于objectAtIndex:1(iOS 9 及更低版本为 3)。
    • @Elad 感谢您的更新将对其进行测试并尽快更新。
    【解决方案2】:

    在 ZBar 的最后一个版本中,我用另一条路径解决了这个问题:

    UIView * infoButton = [[[[[reader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
    
    [infoButton setHidden:YES];
    

    数组键改为[2] [0] [3]

    【讨论】:

      【解决方案3】:

      试试这个代码:

      UIView * infoButton = [[[[[reader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
      
      [infoButton setHidden:YES];
      

      【讨论】:

      • 这不是 icodebuster 给出的相同答案。你只是复制粘贴它。
      【解决方案4】:

      对我来说,按钮的路径有点不同,所以这是我的解决方案:

      获取按钮:

      UIButton *cancelButton = [[[[[reader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:2] subviews] objectAtIndex:0];
      

      并隐藏它:

      [cancelButton setHidden:YES];
      

      或者用这个按钮做任何事情,我需要翻译它:

      [cancelButton setTitle:@"キャンセル" forState:UIControlStateNormal];
      

      【讨论】:

        【解决方案5】:

        另一个黑客。

        我不想只依赖视图和子视图索引,很容易被改变。
        所以我访问了插入信息按钮的工具栏,并删除了相应的UIBarButtonItem

        创建 ZBarReaderViewController 的子类:

        @interface ZBarReaderViewControllerWithoutInfoButton : ZBarReaderViewController
        
        @end
        
        @implementation ZBarReaderViewControllerWithoutInfoButton
        
        
        - (void)viewWillAppear:(BOOL)animated {
            [super viewWillAppear:animated];
        
            // Accessing the toolbar
            UIToolbar *toolbar = [[controls subviews] firstObject];
        
            // Only keeping the first two items of the toolbar, thus deleting the info button
            if ([toolbar isKindOfClass:UIToolbar.class]) {
                toolbar.items = @[ toolbar.items[0], toolbar.items[1] ];
            }
        }
        
        @end
        

        在展示扫描仪视图控制器时不要忘记实例化这个新的子类([ZBarReaderViewControllerWithoutInfoButton new] 而不是 ``[ZBarReaderViewController new]`)。


        之前:

        之后:

        【讨论】:

        • 太棒了...Thanxxxx。
        【解决方案6】:

        针对新设备的新解决方案,如在 iOS10 中,此按钮为 2 而不是 index3,这是应用了之前解决方案的代码。

        float currentVersion = 5.1;
        float sysVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
        UIView * infoButton;
        
        if (sysVersion > currentVersion && sysVersion < 10 )
           infoButton = [[[[[self.scanReader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
        else
           infoButton = [[[[[self.scanReader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:1];
        
        [infoButton setHidden:YES];
        

        希望对你有帮助,问候

        【讨论】:

          【解决方案7】:

          不是你所要求的,但要删除屏幕底部的整个栏,你可以使用

          reader.showsZBarControls = NO;
          

          【讨论】:

            【解决方案8】:

            这是工作代码块。

            float currentVersion = 5.1;
            float sysVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
            
            UIView * infoButton;
            
            if (sysVersion > currentVersion && sysVersion < 10 )
                infoButton = [[[[[codeReader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
            else
                infoButton = [[[[[codeReader.view.subviews objectAtIndex:1] subviews] objectAtIndex:0] subviews] objectAtIndex:1];
            
            [infoButton setHidden:YES];
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-29
              • 1970-01-01
              • 2021-11-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-05
              • 1970-01-01
              相关资源
              最近更新 更多