2012-04-05 14 views
20

私は私のUITabBar UITabBar selectionIndicatorImageパディング

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

ためのカスタムインジケータ画像を設定し、私の周りtabBarSelectedImage 4PXパディングを取得します。そのパディングを0pxに設定することは可能ですか?私のtabBarSelectedImageはスペース全体を塗りつぶし、境界線は表示されません。

答えて

5

ここにあなたの問題の解決策があります...私は実際にこれをやっていませんでした...私は何か他のことをしていましたが、次のコードはあなたに多くの助けになります....まず私は何をした。

  1. は、私はメソッドをオーバーライド...今私はUITabbarControllerの私のカスタムクラスでは、上記の方法と呼ばれるUITabbarのcatagoryを作って、その

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

    に次のメソッドを実装
    -(void)setSelectedIndex:(NSUInteger)selectedIndex)、その方法で以下のことを行った。

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

あなたはcatagoryまたはサブクラス化を避けるためにコードを最適化することができます...しかし、そのために、あなたが私に言うことができるすべての問題の場合は客観C.上のグリップを持っている必要があります。前 乾杯

-2
  1. まず、setSelectionIndicatorImage第二に、
  2. [UIColor clearColor]にあなたはタブバーのサブビューとしてあなたの画像を追加し、tabbarcontrollerに任意のviewcontrollersを追加します。次に、タブバーの下にインジケータ画像として表示されます
  3. tabbarcontroller delegateメソッドを実装して画像の位置を変更します。

私はこの方法を実装しており、完璧に動作します。 tabbarの向きをさまざまに変更する場合は、少し微調整する必要があります。 UITabbarControllerをサブクラス化し、layoutSubviewメソッドを実装できます。

4

私は道簡単な解決策が見つかりました:

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

素晴らしい! iOS 7では両面2pxで十分です。それ以外の場合は、項目アイコンがエッジに移動して見えます。 – hybridcattt

1

をさて、ここで私が見つけたことはサイズ変更可能な画像を使用する場合にのみパディングが表示されていることです。サイズ変更不可能な画像を使用している場合、パディングはありません。

したがって、可能な解決策は、アイテムサイズが変更されるたびにUITabBarをサブクラス化し、selectionIndicatorImageを構成することです。

@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

これは非常に便利です! – orkenstein