How to hide the info button in ZBar Bar Code Reader for iOS6.0 and higher

I am using the ZBar Bar Code Reader for iOS 5.0 and higher in my iOS application.

I made a hidden info button using the following code in the camera interface.

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

But for some reason, this code does not work for iOS6.0 and higher.

+7
source share
8 answers

Try this code, it worked for me on iOS5.0 and above.

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

Explanation. In iOS 6.0, if you print a magazine.

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

Exit.

 "<_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>> 

in iOS 5.0, if you print a magazine.

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

Exit.

 "<_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>>" 

Therefore, for iOS 6.0 and above, it should be an object in index 3, since there is an additional view of UIImageView .

+10
source

With the latest version of ZBar, I sold this problem in a different way:

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

Array keys changed to [2] [0] [3]

+6
source

Try this code:

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

For me, the path to the button was a little different, so here is my solution:

Get button:

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

And hide it:

 [cancelButton setHidden:YES]; 

Or do something with this button, I needed to translate it:

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

Another hack.

I did not want to rely solely on what I see in the view and in subviews, which are very subject to change.
Therefore, I turn to the toolbar where the info button is inserted, and delete the corresponding UIBarButtonItem .

Create a subclass of 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 

Remember to create this new subclass ( [ZBarReaderViewControllerWithoutInfoButton new] instead of `` [ZBarReaderViewController new] `) when introducing the scanner view controller.


Before:

Before, with info button

After:

After, without info button

+2
source

New solutions for new devices, like in iOS10, are buttons 2 instead of index3, here is the code with the solution applied earlier.

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

Hope this helps, believes

+2
source

Not ok what you requested, but to remove the entire panel at the bottom of the screen, you can use

 reader.showsZBarControls = NO; 
+1
source

Here is a working code block.

 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]; 
0
source

All Articles