- 浏览: 2478825 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
jsntghf:
peio 写道这个怎么运行?Ruby On Rails的环境搭 ...
多文件上传之uploadify -
peio:
这个怎么运行?
多文件上传之uploadify -
往事如烟1:
我的项目是自己init了一个原始的project,之后将ver ...
React Native热部署之CodePush -
jsntghf:
往事如烟1 写道我按照你的说明进行,发现app退出之后,在进入 ...
React Native热部署之CodePush -
往事如烟1:
我按照你的说明进行,发现app退出之后,在进入不正确,请问是什 ...
React Native热部署之CodePush
以前写过一篇文章:自定义标签栏,这篇文章提供了另一种自定义标签栏的方式。
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
示例图:
发表评论
-
Error watching file for changes: EMFILE
2016-12-15 11:57 1240执行npm start后报错: Error watc ... -
CocoaPods升级1.1.1报错
2016-12-15 08:39 743ERROR: While executing gem .. ... -
Visual Studio Code运行React Native报错
2016-06-13 09:43 1562React Native:0.27.2 React:15 ... -
React Native 0.27.2编译报错this._nativeModule.addListener is not a function
2016-06-12 15:21 3797React Native:0.27.2 React:15 ... -
Unable to resolve module ReactDefaultPerf from
2016-06-02 13:04 2736package.json信息如下: "reac ... -
React Native 0.26.2编译报错Undefined symbols for architecture x86_64
2016-05-26 11:15 1952React Native:0.26.2 React:15. ... -
Failed to update auto layout status: Failed to load designables from path (null)
2016-04-05 22:11 1670确保CocoaPods是0.36.1以上版本,然后在podf ... -
集成微信支付出现Undefined symbols for architecture x86_64错误
2016-03-21 13:22 1687Undefined symbols for architec ... -
React Native热部署之CodePush
2016-01-10 22:27 6135本文使用的环境是Mac OS 10.11.1、Xcode ... -
浅谈React Native中的FlexBox布局
2015-11-17 18:38 4275React Native通过一个基于FlexBox的布局引 ... -
React Native之构建一个简单的列表页
2015-10-23 14:45 2101本文中我们将创建一个简单的电影应用,这个应用将从Rotten ... -
React Native之环境搭建
2015-10-20 16:30 1396本文使用的环境是Mac O ... -
获取图片属性的方法
2015-10-18 20:43 3083很多时候我们需要获 ... -
NSCache的下标用法
2015-09-18 00:19 1173NSCache类和NSDictionary类很相似,也提供 ... -
如何给category添加属性
2015-08-16 10:41 646主要是使用了runtime中的associative机制。 ... -
UITableView的两种重用Cell方法的区别
2015-08-10 13:07 16069UITableView中有两种重用Cell的方法: - ... -
SDImageCache.m报错Unused variable 'fileName'
2015-08-04 21:56 1136GCC手册中的相关解释: unused:This att ... -
Swift调用Objective-C
2015-07-13 23:33 1180Swift调用Objective-C需要一个名为<工程 ... -
使用GCD实现倒计时
2015-07-24 21:47 1047__block int timeout = 60; // ... -
导航栏加分割线的实现
2015-07-01 22:00 1695self.view.backgroundColor = [U ...
相关推荐
用UIView仿制标签栏,本质上还是用UIKit的UITabBarController类管理多个View Controller。使用方便灵活,能根据实际情况进行更细致的自定义。
要求iOS 7.1 + 弧配置标签栏项的图片要求图标图像选中和未选中的背景图片特征使用自动布局您可以为选项卡的选定、未选定状态设置自定义背景图像、图标和文本(自定义字体和颜色)。 文字和图标图片的排列有两种配置...
小程序,轻量级设计,无需下载安装,即开即用,释放手机内存压力,轻松应对日常各种需求。无论是购物支付、信息查询,还是休闲娱乐、生活服务,我们都一应俱全,满足您的多元化需求。
custom_tab_bar 自定义标签栏
移动TabBar Flutter框架的自定义标签栏小部件。 该设计灵感来自Rally项目(材料设计研究之一)。入门将包添加到pubspec.yaml dependencies : ... shifting_tabbar : ^0.3.1导入包裹import 'package:shifting_tabbar/...
标签栏 自定义标签栏和3种控制器来实现导航
android 标题栏自定义标签,可以实现 左中右,文字、图片显示。一句话调用标题栏,沉浸式显示
可调节文档标签栏显示位置,可以显示在工作区的上、下、左或者右方,可以自定义标签栏的颜色; WordTab和ExcelTab提供了标签锁定功能,PowerPointTab不支持,锁定后的文档不能保存和关闭; 一键存储全部文档 存储全部...
可调节文档标签栏显示位置,可以显示在工作区的上、下、左或者右方,可以自定义标签栏的颜色; WordTab和ExcelTab提供了标签锁定功能,PowerPointTab不支持,锁定后的文档不能保存和关闭; 独立Office Tab设置中心...
在iOS中自定义选项卡栏控制器您可以上找到完整的教程本教程由The App Guruz提出-印度最好的之一
1.这是我参考网上例子,自己写的。...2.导航栏有四个标签,切换到不同的标签,viewpage页会切换相对应的fragment。 3.标签切换时,聚焦光标会有移动效果,稍加改进就可以有更酷炫的效果。 希望能帮助到有需要的人!
•可以自定义标签栏的颜色 •WordTab和ExcelTab提供了标签锁定功能(不支持PPtTab),锁定后的文档不能保存和关闭。 •独立OfficeTab设置中心,更加方便的设置OfficeTab的各组件功能 •漂亮的的皮肤外观样式,有...
可自定义标签栏外观 您可以自定义标签及标签列颜色。标签共有 11 种风格可供选择。您可以根据喜好,自定义字型及每个标签的名字(应用自定义,您需要重启微软 Office 程序)。 Office Tab Enterprise 其他功能: ...
另外,假如您打开文档时,只需要在标签栏的空白处点击右键并单击“Word Tab选项”,Word Tab选项窗口会自动弹出,此时您就可以自定义标签栏了,工作簿和演示文稿也可以执行此操作。 3.office Tab 支持多种语言吗? ...
可以自定义标签栏的颜色。 为WordTab和ExcelTab添加了标签锁定功能(不支持PPtTab) 添加了OfficeTab设置中心,更加方便的设置OfficeTab的各组件 更多的的外观样式(11种) 添加中键关闭文档,仍然可以左键双击...
viewpager顶部标签栏,效果类似网易新闻的客户端
这是一个App Store中大部分app用到的app简易框架 ,易上手,自定义的导航栏,自定义的底部标签栏 下载即可整合到你的工程中。适合初学新司机。(我也是新司机哈哈)
可以自定义标签栏的颜色 WordTab和ExcelTab提供了标签锁定功能(不支持PPtTab),锁定后的文档不能保存和关闭。 独立OfficeTab设置中心,更加方便的设置OfficeTab的各组件功能 漂亮的的皮肤外观样式,有11种可以选择...
TabBar-master 标签栏控件,支持自定义圆角弧度