`
jsntghf
  • 浏览: 2542549 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

自定义标签栏

    博客分类:
  • iOS
阅读更多

以前写过一篇文章:自定义标签栏,这篇文章提供了另一种自定义标签栏的方式。

 

CustomTabBarViewController.h

 

#import "CustomTabBar.h"

@interface CustomTabBarViewController : UIViewController <CustomTabBarDelegate> {
    CustomTabBar *tabBar;
}

@property (nonatomic, retain) CustomTabBar *tabBar;

@end

 

CustomTabBarViewController.m

 

#import "CustomTabBarViewController.h"

#define SELECTED_VIEW_CONTROLLER_TAG 98456345

static NSArray *tabBarItems = nil;

@implementation CustomTabBarViewController
@synthesize tabBar;

- (void) awakeFromNib {
    UIViewController *detailController1 = [[[UIViewController alloc] init] autorelease];
    detailController1.view.backgroundColor = [UIColor redColor];
    
    UIViewController *detailController2 = [[[UIViewController alloc] init] autorelease];
    detailController2.view.backgroundColor = [UIColor whiteColor];
    
    UIViewController *detailController3 = [[[UIViewController alloc] init] autorelease];
    detailController3.view.backgroundColor = [UIColor blueColor];
    
    UIViewController *detailController4 = [[[UIViewController alloc] init] autorelease];
    detailController4.view.backgroundColor = [UIColor cyanColor];
    
    UIViewController *detailController5 = [[[UIViewController alloc] init] autorelease];
    detailController5.view.backgroundColor = [UIColor purpleColor];
    
    tabBarItems = [[NSArray arrayWithObjects:
                    [NSDictionary dictionaryWithObjectsAndKeys:@"chat.png", @"image", detailController1, @"viewController", nil],
                    [NSDictionary dictionaryWithObjectsAndKeys:@"compose-at.png", @"image", detailController2, @"viewController", nil],
                    [NSDictionary dictionaryWithObjectsAndKeys:@"messages.png", @"image", detailController3, @"viewController", nil],
                    [NSDictionary dictionaryWithObjectsAndKeys:@"magnifying-glass.png", @"image", detailController4, @"viewController", nil],
                    [NSDictionary dictionaryWithObjectsAndKeys:@"more.png", @"image", detailController5, @"viewController", nil], nil] retain];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *tabBarGradient = [UIImage imageNamed:@"TabBarGradient.png"];
    self.tabBar = [[[CustomTabBar alloc] initWithItemCount:tabBarItems.count itemSize:CGSizeMake(self.view.frame.size.width / tabBarItems.count, tabBarGradient.size.height * 2) tag:0 delegate:self] autorelease];
    tabBar.frame = CGRectMake(0, self.view.frame.size.height - (tabBarGradient.size.height * 2), self.view.frame.size.width, tabBarGradient.size.height * 2);
    [self.view addSubview:tabBar];
    [tabBar selectItemAtIndex:0];
    [self touchDownAtItemAtIndex:0];
}

#pragma mark -
#pragma mark CustomTabBarDelegate

- (UIImage *) imageFor:(CustomTabBar *)tabBar atIndex:(NSUInteger)itemIndex {
    NSDictionary *data = [tabBarItems objectAtIndex:itemIndex];
    return [UIImage imageNamed:[data objectForKey:@"image"]];
}

- (UIImage *) backgroundImage {
    CGFloat width = self.view.frame.size.width;
    UIImage *topImage = [UIImage imageNamed:@"TabBarGradient.png"];
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, topImage.size.height * 2), NO, 0.0);
    UIImage *stretchedTopImage = [topImage stretchableImageWithLeftCapWidth:0 topCapHeight:0];
    [stretchedTopImage drawInRect:CGRectMake(0, 0, width, topImage.size.height)];
    [[UIColor blackColor] set];
    CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, topImage.size.height, width, topImage.size.height));
    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return resultImage;
}

- (UIImage *) selectedItemBackgroundImage {
    return [UIImage imageNamed:@"TabBarItemSelectedBackground.png"];
}

- (UIImage *) glowImage {
    UIImage *tabBarGlow = [UIImage imageNamed:@"TabBarGlow.png"];
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(tabBarGlow.size.width, tabBarGlow.size.height - 4.0), NO, 0.0);
    [tabBarGlow drawAtPoint:CGPointZero];
    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return resultImage;
}

- (UIImage *) selectedItemImage {
    UIImage *tabBarGradient = [UIImage imageNamed:@"TabBarGradient.png"];
    CGSize tabBarItemSize = CGSizeMake(self.view.frame.size.width / tabBarItems.count, tabBarGradient.size.height * 2);
    UIGraphicsBeginImageContextWithOptions(tabBarItemSize, NO, 0.0);
    [[[UIImage imageNamed:@"TabBarSelection.png"] stretchableImageWithLeftCapWidth:4.0 topCapHeight:0] drawInRect:CGRectMake(0, 4.0, tabBarItemSize.width, tabBarItemSize.height - 4.0)];  
    UIImage *selectedItemImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return selectedItemImage;
}

- (UIImage *) tabBarArrowImage {
    return [UIImage imageNamed:@"TabBarNipple.png"];
}

- (void) touchDownAtItemAtIndex:(NSUInteger)itemIndex {
    UIView *currentView = [self.view viewWithTag:SELECTED_VIEW_CONTROLLER_TAG];
    [currentView removeFromSuperview];
    
    NSDictionary *data = [tabBarItems objectAtIndex:itemIndex];
    UIViewController *viewController = [data objectForKey:@"viewController"];
    
    UIImage *tabBarGradient = [UIImage imageNamed:@"TabBarGradient.png"];
    
    viewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - (tabBarGradient.size.height * 2));
    
    viewController.view.tag = SELECTED_VIEW_CONTROLLER_TAG;
    
    [self.view insertSubview:viewController.view belowSubview:tabBar];
    
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(addGlowTimerFireMethod:) userInfo:[NSNumber numberWithInteger:itemIndex] repeats:NO];
}

- (void)addGlowTimerFireMethod:(NSTimer *)theTimer {
    for (NSUInteger i = 0 ; i < tabBarItems.count ; i++) {
        [tabBar removeGlowAtIndex:i];
    }
    [tabBar glowItemAtIndex:[[theTimer userInfo] integerValue]];
}

- (void)dealloc {
    [tabBar release];
    [super dealloc];
}

@end

 

CustomTabBar.h

 

@class CustomTabBar;

@protocol CustomTabBarDelegate

- (UIImage *) imageFor:(CustomTabBar *)tabBar atIndex:(NSUInteger)itemIndex;
- (UIImage *) backgroundImage;
- (UIImage *) selectedItemBackgroundImage;
- (UIImage *) glowImage;
- (UIImage *) selectedItemImage;
- (UIImage *) tabBarArrowImage;

@optional
- (void) touchUpInsideItemAtIndex:(NSUInteger)itemIndex;
- (void) touchDownAtItemAtIndex:(NSUInteger)itemIndex;
@end

@interface CustomTabBar : UIView {
    NSObject <CustomTabBarDelegate> *delegate;
    NSMutableArray *buttons;
}

@property (nonatomic, retain) NSMutableArray *buttons;

- (id) initWithItemCount:(NSUInteger)itemCount itemSize:(CGSize)itemSize tag:(NSInteger)objectTag delegate:(NSObject <CustomTabBarDelegate> *)customTabBarDelegate;

- (void) selectItemAtIndex:(NSInteger)index;
- (void) glowItemAtIndex:(NSInteger)index;
- (void) removeGlowAtIndex:(NSInteger)index;

@end

 

CustomTabBar.m

 

#import "CustomTabBar.h"

#define GLOW_IMAGE_TAG 2394858
#define TAB_ARROW_IMAGE_TAG 2394859

@interface CustomTabBar (PrivateMethods)
- (CGFloat) horizontalLocationFor:(NSUInteger)tabIndex;
- (void) addTabBarArrowAtIndex:(NSUInteger)itemIndex;
- (UIButton *) buttonAtIndex:(NSUInteger)itemIndex width:(CGFloat)width;
- (UIImage *) tabBarImage:(UIImage *)startImage size:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImage;
- (UIImage *) blackFilledImageWithWhiteBackgroundUsing:(UIImage *)startImage;
- (UIImage *) tabBarBackgroundImageWithSize:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImage;
@end

@implementation CustomTabBar
@synthesize buttons;

- (id) initWithItemCount:(NSUInteger)itemCount itemSize:(CGSize)itemSize tag:(NSInteger)objectTag delegate:(NSObject <CustomTabBarDelegate> *)customTabBarDelegate {
    if (self = [super init]) {
        self.tag = objectTag;
        
        delegate = customTabBarDelegate;
        
        UIImage *backgroundImage = [delegate backgroundImage];
        UIImageView *backgroundImageView = [[[UIImageView alloc] initWithImage:backgroundImage] autorelease];
        backgroundImageView.frame = CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);
        [self addSubview:backgroundImageView];
        
        self.frame = CGRectMake(0, 0, itemSize.width * itemCount, itemSize.height);
        
        self.buttons = [[NSMutableArray alloc] initWithCapacity:itemCount];
        
        CGFloat horizontalOffset = 0;
        
        for (NSUInteger i = 0 ; i < itemCount ; i++) {
            UIButton *button = [self buttonAtIndex:i width:self.frame.size.width / itemCount];
            
            [button addTarget:self action:@selector(touchDownAction:) forControlEvents:UIControlEventTouchDown];
            [button addTarget:self action:@selector(touchUpInsideAction:) forControlEvents:UIControlEventTouchUpInside];
            [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchUpOutside];
            [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchDragOutside];
            [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchDragInside];
            
            [buttons addObject:button];
            
            button.frame = CGRectMake(horizontalOffset, 0.0, button.frame.size.width, button.frame.size.height);
            
            [self addSubview:button];
            
            horizontalOffset = horizontalOffset + itemSize.width;
        }
    }
    
    return self;
}

- (void) dimAllButtonsExcept:(UIButton *)selectedButton {
    for (UIButton *button in buttons) {
        if (button == selectedButton) {
            button.selected = YES;
            button.highlighted = button.selected ? NO : YES;
            
            UIImageView *tabBarArrow = (UIImageView *)[self viewWithTag:TAB_ARROW_IMAGE_TAG];
            NSUInteger selectedIndex = [buttons indexOfObjectIdenticalTo:button];
            if (tabBarArrow) {
                [UIView beginAnimations:nil context:nil];
                [UIView setAnimationDuration:0.2];
                CGRect frame = tabBarArrow.frame;
                frame.origin.x = [self horizontalLocationFor:selectedIndex];
                tabBarArrow.frame = frame;
                [UIView commitAnimations];
            } else {
                [self addTabBarArrowAtIndex:selectedIndex];
            }
        } else {
            button.selected = NO;
            button.highlighted = NO;
        }
    }
}

- (void)touchDownAction:(UIButton *)button {
    [self dimAllButtonsExcept:button];
    
    if ([delegate respondsToSelector:@selector(touchDownAtItemAtIndex:)])
        [delegate touchDownAtItemAtIndex:[buttons indexOfObject:button]];
}

- (void)touchUpInsideAction:(UIButton *)button {
    [self dimAllButtonsExcept:button];
    
    if ([delegate respondsToSelector:@selector(touchUpInsideItemAtIndex:)])
        [delegate touchUpInsideItemAtIndex:[buttons indexOfObject:button]];
}

- (void)otherTouchesAction:(UIButton *)button {
    [self dimAllButtonsExcept:button];
}

- (void) selectItemAtIndex:(NSInteger)index {
    UIButton *button = [buttons objectAtIndex:index];
    
    [self dimAllButtonsExcept:button];
}

- (void) glowItemAtIndex:(NSInteger)index {
    UIButton *button = [buttons objectAtIndex:index];
    
    UIImage *glowImage = [delegate glowImage];
    
    UIImageView *glowImageView = [[[UIImageView alloc] initWithImage:glowImage] autorelease];
    
    glowImageView.frame = CGRectMake(button.frame.size.width / 2.0 - glowImage.size.width / 2.0, button.frame.origin.y + button.frame.size.height - glowImage.size.height, glowImage.size.width, glowImage.size.height);
    
    glowImageView.tag = GLOW_IMAGE_TAG;
    
    [button addSubview:glowImageView];
}

- (void) removeGlowAtIndex:(NSInteger)index {
    UIButton *button = [buttons objectAtIndex:index];
    UIImageView *glowImageView = (UIImageView *)[button viewWithTag:GLOW_IMAGE_TAG];
    [glowImageView removeFromSuperview];
}

- (CGFloat) horizontalLocationFor:(NSUInteger)tabIndex {
    UIImageView *tabBarArrow = (UIImageView *)[self viewWithTag:TAB_ARROW_IMAGE_TAG];  
    CGFloat tabItemWidth = self.frame.size.width / buttons.count;
    CGFloat halfTabItemWidth = (tabItemWidth / 2.0) - (tabBarArrow.frame.size.width / 2.0);
    return (tabIndex * tabItemWidth) + halfTabItemWidth;
}

- (void) addTabBarArrowAtIndex:(NSUInteger)itemIndex {
    UIImage *tabBarArrowImage = [delegate tabBarArrowImage];
    UIImageView *tabBarArrow = [[[UIImageView alloc] initWithImage:tabBarArrowImage] autorelease];
    tabBarArrow.tag = TAB_ARROW_IMAGE_TAG;
    CGFloat verticalLocation = -tabBarArrowImage.size.height + 2;
    tabBarArrow.frame = CGRectMake([self horizontalLocationFor:itemIndex], verticalLocation, tabBarArrowImage.size.width, tabBarArrowImage.size.height);
    
    [self addSubview:tabBarArrow];
}

- (UIButton *) buttonAtIndex:(NSUInteger)itemIndex width:(CGFloat)width {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0.0, 0.0, width, self.frame.size.height);
    
    UIImage *rawButtonImage = [delegate imageFor:self atIndex:itemIndex];
    UIImage *buttonImage = [self tabBarImage:rawButtonImage size:button.frame.size backgroundImage:nil];
    UIImage *buttonPressedImage = [self tabBarImage:rawButtonImage size:button.frame.size backgroundImage:[delegate selectedItemBackgroundImage]];
    
    [button setImage:buttonImage forState:UIControlStateNormal];
    [button setImage:buttonPressedImage forState:UIControlStateHighlighted];
    [button setImage:buttonPressedImage forState:UIControlStateSelected];
    
    [button setBackgroundImage:[delegate selectedItemImage] forState:UIControlStateHighlighted];
    [button setBackgroundImage:[delegate selectedItemImage] forState:UIControlStateSelected];
    
    button.adjustsImageWhenHighlighted = NO;
    
    return button;
}

- (UIImage *) tabBarImage:(UIImage *)startImage size:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImageSource {
    UIImage *backgroundImage = [self tabBarBackgroundImageWithSize:startImage.size backgroundImage:backgroundImageSource];
    
    UIImage *bwImage = [self blackFilledImageWithWhiteBackgroundUsing:startImage];
    
    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(bwImage.CGImage),
                                             CGImageGetHeight(bwImage.CGImage),
                                             CGImageGetBitsPerComponent(bwImage.CGImage),
                                             CGImageGetBitsPerPixel(bwImage.CGImage),
                                             CGImageGetBytesPerRow(bwImage.CGImage),
                                             CGImageGetDataProvider(bwImage.CGImage), NULL, YES);
    
    CGImageRef tabBarImageRef = CGImageCreateWithMask(backgroundImage.CGImage, imageMask);
    
    UIImage *tabBarImage = [UIImage imageWithCGImage:tabBarImageRef scale:startImage.scale orientation:startImage.imageOrientation];
    
    CGImageRelease(imageMask);
    CGImageRelease(tabBarImageRef);
    
    UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);
    
    [tabBarImage drawInRect:CGRectMake((targetSize.width / 2.0) - (startImage.size.width / 2.0), (targetSize.height / 2.0) - (startImage.size.height / 2.0), startImage.size.width, startImage.size.height)];
    
    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return resultImage;
}

- (UIImage *) blackFilledImageWithWhiteBackgroundUsing:(UIImage *)startImage {
    CGRect imageRect = CGRectMake(0, 0, CGImageGetWidth(startImage.CGImage), CGImageGetHeight(startImage.CGImage));
    
    CGContextRef context = CGBitmapContextCreate(NULL, imageRect.size.width, imageRect.size.height, 8, 0, CGImageGetColorSpace(startImage.CGImage), kCGImageAlphaPremultipliedLast);
    
    CGContextSetRGBFillColor(context, 1, 1, 1, 1);
    CGContextFillRect(context, imageRect);
    
    CGContextClipToMask(context, imageRect, startImage.CGImage);
    CGContextSetRGBFillColor(context, 0, 0, 0, 1);
    CGContextFillRect(context, imageRect);
    
    CGImageRef newCGImage = CGBitmapContextCreateImage(context);
    UIImage* newImage = [UIImage imageWithCGImage:newCGImage scale:startImage.scale orientation:startImage.imageOrientation];
    
    CGContextRelease(context);
    CGImageRelease(newCGImage);
    
    return newImage;
}

- (UIImage *) tabBarBackgroundImageWithSize:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImage {
    UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);
    if (backgroundImage) {
        [backgroundImage drawInRect:CGRectMake((targetSize.width - CGImageGetWidth(backgroundImage.CGImage)) / 2, (targetSize.height - CGImageGetHeight(backgroundImage.CGImage)) / 2, CGImageGetWidth(backgroundImage.CGImage), CGImageGetHeight(backgroundImage.CGImage))];
    } else {
        [[UIColor lightGrayColor] set];
        UIRectFill(CGRectMake(0, 0, targetSize.width, targetSize.height));
    }
    
    UIImage *finalBackgroundImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return finalBackgroundImage;
}

- (void)dealloc {
    [buttons release];
    [super dealloc];
}

@end

 

示例图:

分享到:
评论

相关推荐

    IOS 自定义标签栏

    本篇文章将深入探讨如何在iOS应用中实现自定义标签栏,以增强用户界面的个性化与交互体验。 首先,我们了解下iOS系统内置的UITabBarController。它是苹果官方提供的用于管理多个ViewController的容器,其底部通常会...

    微信小程序自定义标签栏(TabBar) 组件.zip

    在微信小程序开发中,自定义标签栏(TabBar)组件是一项关键功能,它为用户提供了一种直观、便捷的导航方式,使用户能够轻松地在不同的页面间切换。本教程将深入探讨如何在微信小程序中创建并自定义TabBar组件,以...

    flutter_custom_tab_bar:自定义标签栏

    `flutter_custom_tab_bar`是一个专门为实现自定义标签栏而设计的库,它允许开发者根据自己的需求创建独特的TabBar视图,以此来增强应用程序的界面设计。这个库是用Dart语言编写的,与Flutter框架紧密结合,提供了...

    iOS工程模板标签栏UI框架

    在这个特定的案例中,“iOS工程模板标签栏UI框架”是一个专为创建带有自定义标签栏的iOS项目而设计的框架,它简化了开发过程,减少了重复工作。 接着,我们来看“TabBar”和“标签栏”。在iOS中,...

    vs2008如何创建自定义工具栏

    在Visual Studio 2008(VS2008)中创建自定义工具栏是一项非常实用的技能,它可以帮助开发者个性化工作环境,提高开发效率。本文将深入探讨如何实现这一功能,以及涉及到的相关知识点。 首先,我们需要理解工具栏在...

    shifting_tabbar:Flutter框架的自定义标签栏小部件

    移动TabBar Flutter框架的自定义标签栏小部件。 该设计灵感来自Rally项目(材料设计研究之一)。入门将包添加到pubspec.yaml dependencies : ... shifting_tabbar : ^0.3.1导入包裹import 'package:shifting_tabbar/...

    customize-tab-bar-controller-in-ios:在iOS中自定义标签栏控制器

    在iOS应用开发中,自定义标签栏控制器(Tab Bar Controller)是常见的需求,它允许开发者根据应用程序的特定需求创建独特的用户界面。本文将深入探讨如何使用Objective-C在iOS中实现这一功能,主要围绕标题“在iOS中...

    自定义标题栏可缩放的QDialog

    这个自定义的标题栏可以包含我们想要的按钮(如最小化、最大化、关闭)以及文本标签。我们还需要处理鼠标事件,使得用户可以拖动标题栏来移动整个对话框。这可以通过重载`mousePressEvent`和`mouseMoveEvent`方法来...

    ios-简易app整体框架自定义底部标签栏.zip

    在iOS应用开发中,构建一个用户友好的界面是至关重要的,底部标签栏(Tab Bar)和自定义导航栏(Navigation Bar)就是实现这一目标的关键组件。这个“ios-简易app整体框架自定义底部标签栏.zip”文件提供了一个基础...

    标签栏+导航栏的交互使用

    - 开发者可以自定义标签栏的样式、颜色、字体以及按钮行为,以符合应用的品牌和用户体验设计。 - 在切换标签时,可以实现平滑的过渡动画,使用户感知到内容的连续性,同时传达出不同标签间的独立性。 - 通过KVO...

    notification-Android带按钮自定义通知栏

    "notification-Android带按钮自定义通知栏"项目正是为了解决这个问题,它允许开发者创建具有定制行为的互动式通知。 首先,我们来了解一下Android中的通知系统。在API级别21及以上,Android引入了`...

    自定义标签学习笔记

    ### 自定义标签学习笔记 #### 一、什么是自定义标签? 自定义标签是JSP(Java Server Pages)中的一种功能,允许开发者创建可重用的组件。这些组件封装了特定的功能,可以在不同的JSP页面中复用,从而提高开发效率...

    安卓消息推送通知栏相关-Android实现可定制可滑动的标签栏的代码例子.rar

    开发者可以根据需要自定义标签栏的外观,包括文字、图标、颜色、字体样式等,以适应应用的UI风格。例如,可以改变标签的背景色、文字颜色、选中状态的视觉效果等。 3. **可滑动的标签栏**:在Android中,可滑动的...

    android studio自定义标题栏,可自定义回退按钮事件

    在Android开发中,自定义标题栏是提升应用用户体验和界面个性化的重要手段。Android Studio作为官方推荐的集成开发环境,提供了丰富的工具和API来帮助开发者实现这一目标。本篇将详细探讨如何在Android Studio中实现...

    设置TabNavigator组件的标签头的自定义皮肤

    对于更复杂的自定义,我们可以使用`renderTabBar`属性,它允许我们完全自定义标签栏的渲染逻辑。通过这个属性,我们可以编写自己的组件来替代默认的标签栏,从而实现任意复杂的布局和交互效果。 ```jsx import ...

    自定义viewpager的顶部标签栏

    在本项目"自定义viewpager的顶部标签栏"中,我们将实现一个类似于网易新闻客户端顶部标签栏的效果,让用户体验更加友好。 首先,我们需要了解`ViewPager`的基本用法。`ViewPager`通常与`PagerAdapter`一起使用,`...

    JSP自定义标签之自动完成框

    本篇文章将深入探讨如何在JSP中实现自定义标签,特别是创建一个自动完成框的功能。这个功能常见于许多网站的搜索栏,能根据用户输入的内容提供实时的建议。 首先,我们要理解JSP自定义标签的概念。自定义标签是JSP...

    NMBottomTabBarController:用 Objective C 编写的 iOS 自定义标签栏控制器。它使用自动布局

    要求iOS 7.1 + 弧配置标签栏项的图片要求图标图像选中和未选中的背景图片特征使用自动布局您可以为选项卡的选定、未选定状态设置自定义背景图像、图标和文本(自定义字体和颜色)。 文字和图标图片的排列有两种配置...

    CustomTabDemo.rar

    《自定义标签栏CustomTabDemo详解》 在Android应用开发中,用户界面的设计与交互是至关重要的,其中标签栏(Tab)作为常见的导航组件,能够帮助用户轻松切换不同的功能区域。本篇将深入探讨名为“CustomTabDemo”的...

Global site tag (gtag.js) - Google Analytics