20

UITabBarこのようなカスタムインジケーター画像を設定しました

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

私の周りに4pxのパディングを取得しますtabBarSelectedImage。そのパディングを 0px に設定することは可能ですか? tabBarSelectedImageスペース全体を塗りつぶし、境界線が表示されないようにするには?

4

4 に答える 4

5

これがあなたの問題の解決策です...私は実際にこれをしていませんでした...私は何か他のことをしていましたが、次のコードはあなたを大いに助けます....最初に私がしたことをお話しします...

  1. UITabbarその中で次のメソッドのカテゴリを作成して実装しました

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

    ここで、UITabbarController のカスタム クラスで上記のメソッドを呼び出しました... メソッドをオーバーライドし、
    -(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];
    
        }
        } 
        }
    
        }
    

コードを最適化して、カテゴリやサブクラス化を回避できます...しかし、そのためにはObjective Cを把握する必要があります。問題が発生した場合は、私に教えてください。乾杯

于 2012-11-13T12:43:05.293 に答える
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
于 2015-02-13T10:04:12.537 に答える
-3
  1. まずsetSelectionIndicatorImage[UIColor clearColor]
  2. 次に、ViewController を に追加するtabbarcontrollerに、画像をサブビューとしてタブバーに追加します。次に、タブバー項目の下にインジケーター画像として表示されます
  3. tabbarcontroller delegate画像の位置を変更するメソッドを実装します。

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

于 2012-11-14T01:26:39.560 に答える