2012-04-05 8 views
20

que establecer una imagen de indicador personalizado para mi UITabBar como estoacolchado UITabBar selectionIndicatorImage

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

y obtener un acolchado 4 píxeles alrededor de mi tabBarSelectedImage. ¿Es posible establecer ese relleno en 0px? ¿Para que mi tabBarSelectedImage llene todo el espacio y no haya ningún borde visible?

Respuesta

5

Aquí está la solución de su problema ... En realidad no estaba haciendo esto ... Estaba haciendo otra cosa, pero el siguiente código le ayudará mucho ... Primero le digo lo que hice ... .

  1. hice un CATEGORIA de UITabbar y poner en práctica el método siguiente en que

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

    Ahora que se llama el método anterior en mi clase personalizada de UITabBarController ... puedo reemplazar el método
    -(void)setSelectedIndex:(NSUInteger)selectedIndex e hizo lo siguiente en ese método.

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

se puede optimizar el código para evitar hacer CATEGORÍA o subclases ... pero para eso se debe tener para agarre en Objective C. En caso de cualquier problema que pueda decirme. Saludos

-2
  1. En primer lugar, setSelectionIndicatorImage a [UIColor clearColor]
  2. En segundo lugar, Antes de agregar cualquier viewcontrollers a la tabbarcontroller, añada su imagen como una subvista a la barra de pestañas. Luego aparecerá debajo de tabbaritems como la imagen del indicador
  3. Implemente el método tabbarcontroller delegate para cambiar la posición de la imagen.

Lo he implementado de esta manera y funciona perfecto. Debe ajustar un poco si quiere cambiar el tamaño del tabbar para diferentes orientaciones. Puede subclasificar el UITabbarController e implementar el método layoutSubview.

4

He encontrado una manera más sencilla solución:

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

¡Genial! 2px en cada lado es suficiente para iOS 7, de lo contrario, los íconos de los ítems se verán desplazados hacia el borde. – hybridcattt

1

Bueno, aquí lo que he encontrado es que el relleno sólo aparece cuando se utilizan imágenes de tamaño variable. Al usar imágenes no redimensionables, el relleno no está allí.

Por lo tanto, una posible solución es crear una subclase de UITabBar y configurar el selectionIndicatorImage cada vez que cambie el tamaño del elemento.

@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

¡Esto es muy útil! – orkenstein

Cuestiones relacionadas