2012-04-05 18 views
20

stelle ich eine benutzerdefinierte Indikatorbild für meine UITabBar wie dieseUITabBar selectionIndicatorImage Polsterung

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

und eine 4px Polsterung um meine tabBarSelectedImage bekommen. Ist es möglich, das Padding auf 0px zu setzen? So dass mein tabBarSelectedImage den gesamten Raum ausfüllt und kein Rahmen sichtbar ist?

Antwort

5

Hier ist die Lösung Ihres Problems ... Ich habe das eigentlich nicht gemacht ... Ich habe etwas anderes gemacht, aber der folgende Code wird Ihnen sehr helfen .... Zuerst sage ich Ihnen, was ich getan habe .. gemacht.

  1. ich eine catagory von UITabbar und die folgende Methode in diesem

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

    Jetzt implementieren rief ich das obige Verfahren in meiner benutzerdefinierten Klasse von UITabBarController ... ich die Methode
    außer Kraft setzen -(void)setSelectedIndex:(NSUInteger)selectedIndex und machte das folgende in dieser Methode.

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

können Sie den Code optimieren machen catagory oder Subklassifizieren zu vermeiden ... aber dafür müssen Sie auf Objective C. Bei allen Fragen zu greifen haben Sie mir sagen können. Prost

-2
  1. Zuerst setSelectionIndicatorImage-[UIColor clearColor]
  2. Zweitens Bevor Sie Viewcontrollers zum tabbarcontroller hinzuzufügen, fügen Sie Ihr Bild als Subview der Tabbar. Dann erscheint es unter den Tabbaritems als Indikatorbild
  3. Implementieren Sie die tabbarcontroller delegate Methode, um die Position des Bildes zu ändern.

Ich habe diesen Weg implementiert und es funktioniert perfekt. Sie sollten ein wenig zwicken, wenn Sie die Größe tabbar für verschiedene Ausrichtungen ändern möchten. Sie können die UITabbarController Unterklasse ableiten und die Methode layoutSubview implementieren.

4

fand ich eine Möglichkeit, einfachere Lösung:

self.tabBar.frame = CGRectInset(self.tabBar.frame,0,-6); 
+0

Großartig! 2px auf jeder Seite reichen für iOS 7, ansonsten sehen die Item-Icons zum Rand hin verschoben aus. – hybridcattt

1

Nun, hier ist was ich gefunden habe, ist, dass die Polsterung nur angezeigt, wenn die Größe veränderbar Bilder verwenden. Wenn Sie nicht veränderbare Bilder verwenden, ist das Padding nicht vorhanden.

Daher ist eine mögliche Lösung, UITabBar abzuleiten und die selectionIndicatorImage immer zu konfigurieren, wenn sich die Artikelgröße ändert.

@interface TKTabBar 

@end 

@implementation TKTabBar 
{ 
    CGSize _selectionIndicatorImageSize; 
} 

- (void)tk_refreshSelectionIndicatorImageForItemSize:(CGSize)itemSize 
{ 
    // Recompute the selection indicator image only if the size of the item has changed. 
    if (!CGSizeEqualToSize(itemSize, _selectionIndicatorImageSize)) 
    { 
     _selectionIndicatorImageSize = itemSize; 

     // Compute here the new image from the item size. 
     // In this example I'm using a Cocoa Pod called UIImage+Additions to generate images dynamically. 

     UIImage *redImage = [UIImage add_imageWithColor:[UIColor add_colorWithRed255:208 green255:75 blue255:43] size:CGSizeMake(itemSize.width, 2)]; 
     UIImage *clearImage = [UIImage add_imageWithColor:[UIColor clearColor] size:CGSizeMake(itemSize.width, itemSize.height)]; 
     UIImage *mixImage = [clearImage add_imageAddingImage:redImage offset:CGPointMake(0, itemSize.height-2)]; 

     // Finally, I'm setting the image as the selection indicator image. 
     [self setSelectionIndicatorImage:mixImage]; 
    } 
} 

// Using the layout subviews method to detect changes on the tab size 
- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    // Only needed if at least one item 
    if (self.items.count > 0) 
    { 
     CGSize itemSize = CGSizeZero; 

     // Iterating over all subviews 
     for (UIView *view1 in self.subviews) 
     { 
      // Searching for "UITabBarButtons" 
      if ([view1 isKindOfClass:NSClassFromString(@"UITabBarButton")]) 
      { 
       itemSize = view1.bounds.size; 
       break; 
      } 
     } 

     // Applying the new item size 
     [self tk_refreshSelectionIndicatorImageForItemSize:itemSize]; 
    } 
} 

@end 
+0

Das ist sehr nützlich! – orkenstein