Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
590 views
in Technique[技术] by (71.8m points)

iphone - UITabBar selectionIndicatorImage padding

I set a custom indicator image for my UITabBar like this

UIImage *tabBarSelectedImage = [[UIImage imageNamed:@"tabBar_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UITabBar appearance] setSelectionIndicatorImage:tabBarSelectedImage];

and get a 4px padding around my tabBarSelectedImage. Is it possible to set that padding to 0px? So that my tabBarSelectedImage fills the entire space and no border is visible?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Here is the solution of your problem... I was not actually doing this...I was doing something else but the following code will help you a lot....First I tell you what I did...

  1. I made a catagory of UITabbar and implement the following method in that

    - (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor 
    shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur
    {
    CGColorRef cgColor = [color CGColor];
    CGColorRef cgShadowColor = [shadowColor CGColor];
    for (UITabBarItem *item in [self items]) {
    
    if ([item respondsToSelector:@selector(selectedImage)] &&
        [item respondsToSelector:@selector(setSelectedImage:)] &&
        [item respondsToSelector:@selector(_updateView)])
    {
        CGRect contextRect;
        contextRect.origin.x = 0.0f;
        contextRect.origin.y = 0.0f;
    
        //instead of following line you can give our own desired size of contextRect. 
        //just change the method parameters and include a parameter of desired size in it.
        // and this desired size would be the tabbarbutton size...so you will pass the size of 
        // you tabbarbutton here...because on the back of image there is a tabbarbutton and if
        // set the image of button size it will occupy whole the are of button.
    
        contextRect.size = desired size //[[item selectedImage] size];
        // Retrieve source image and begin image context
        UIImage *itemImage = [item image];
        CGSize itemImageSize = [itemImage size];
    
        CGPoint itemImagePosition; 
        itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width) / 2);
        itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height) / 2);
        UIGraphicsBeginImageContext(contextRect.size);
        CGContextRef c = UIGraphicsGetCurrentContext();
    
        // Setup shadow
        CGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor);
    
        // Setup transparency layer and clip to mask
        CGContextBeginTransparencyLayer(c, NULL);
        CGContextScaleCTM(c, 1.0, -1.0);
        CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y,
        itemImageSize.width, -itemImageSize.height), [itemImage CGImage]);
    
        // Fill and end the transparency layer
        CGContextSetFillColorWithColor(c, cgColor);
        contextRect.size.height = -contextRect.size.height;
        CGContextFillRect(c, contextRect);
        CGContextEndTransparencyLayer(c);
    
    
        // Set selected image and end context
        [item setSelectedImage:UIGraphicsGetImageFromCurrentImageContext()];
        UIGraphicsEndImageContext();
        // Update the view
        [item _updateView];
       }
       }
    
       }
    

    Now I called the above method in my custom class of UITabbarController... I override the method
    -(void)setSelectedIndex:(NSUInteger)selectedIndex and did the following in that method.

      -(void)setSelectedIndex:(NSUInteger)selectedIndex {
           self.selectedViewController = [self.viewControllers objectAtIndex:selectedIndex];
           NSLog(@"selectedIndex:%d, totalCount:%d",selectedIndex,[self.tabBar.subviews count]);
       for (uint i=1; i < [self.tabBar.subviews count]; i++)
       {
          UIView *view = [self.tabBar.subviews objectAtIndex:i];
          NSLog(@"class:%@",NSStringFromClass([view class]));
       if ([NSStringFromClass([view class]) isEqualToString:@"UITabBarButton"])
       {
        //view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y,  
        view.frame.size.width, self.tabBar.frame.size.height);
          NSLog(@"selectedIndex:%d,i:%d",self.selectedIndex,i);
        if (self.selectedIndex+1==i) {
            [self.tabBar recolorItemsWithColor:[UIColor whiteColor] shadowColor:[UIColor 
                                blackColor] shadowOffset:view.frame.size shadowBlur:0.5];
    
        }
        } 
        }
    
        }
    

You can optimize the code to avoid making catagory or subclassing...but for that you must have to grip on Objective C. In case of any issue you can tell me. Cheers


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...