一 在这里先说一种建立tablebar的方法 建立一个自定义的环境context 自定义的图标 以及与NavgationBar 的联系方式
1. 建立哟个自定义环境
CGContextRef MyCreateBitmapContext (int pixelsWide,int pixelsHigh) { CGContextRef context = NULL; CGColorSpaceRef colorSpace; void * bitmapData; int bitmapByteCount; int bitmapBytesPerRow; bitmapBytesPerRow = (pixelsWide * 4); bitmapByteCount = (bitmapBytesPerRow * pixelsHigh); colorSpace = CGColorSpaceCreateDeviceRGB(); bitmapData = malloc( bitmapByteCount ); if (bitmapData == NULL) { fprintf (stderr, "Memory not allocated!"); CGColorSpaceRelease( colorSpace ); return NULL; } context = CGBitmapContextCreate (bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); if (context== NULL) { free (bitmapData); fprintf (stderr, "Context not created!"); return NULL; } CGColorSpaceRelease( colorSpace ); return context; }
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth,float ovalHeight)
context 为环境 rect为所截取图片的大小 后面的两个参数为图片将要缩放的宽高比例
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth,float ovalHeight) { float fw, fh; if (ovalWidth == 0 || ovalHeight == 0) { CGContextAddRect(context, rect); return; } /*CGContextSaveGState与CGContextRestoreGState的作用 使用Quartz时涉及到一个图形上下文,其中图形上下文中包含一个保存过的图形状态堆栈。在Quartz创建图形上下文时, 该堆栈是空的CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响 随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆栈顶 部的状态弹出,返回到之前的图形状态。这种推入和弹出的方式是回到之前图形状态的快速方 法,避免逐个撤消所有的状态 修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。*/ /*CGRectGetMinX方法的作用得到目前scrollview在当前屏幕中相对于整个UIScrollView的最小值(位于屏幕的最左边) CGRectGetMaxX方法的作用得到目前scrollview在当前屏幕中相对于整个UIScrollView的最大值(位于屏幕的最右边) CGRectGetMinY方法的作用得到目前scrollview在当前屏幕中相对于整个UIScrollView的最小值(位于屏幕的最上边) CGRectGetMaxY方法的作用得到目前scrollview在当前屏幕中相对于整个UIScrollView的最大值(位于屏幕的最下边*/ /*void CGContextAddArc(CGContextRef c,CGFloat x,CGFloat y,CGFloat radius,CGFloat startAngle, CGFloat endAngle, int clockwise) x,y为圆点坐标,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。*/ /*void CGContextAddArcToPoint(CGContextRef c,CGFloat x1,CGFloat y1,CGFloat x2,CGFloat y2, CGFloat radius); 使用该函数绘制圆弧前,首先要确定一个start point. CGContextMoveToPoint(context, 100, 100); 然后设置CGContextAddArcToPoint(context, 50, 100, 50, 150, 50);这里是从起始点100,100开始到第一个点 50,100画一条线段,然后再从第一个点50,100到第二点150,50画另一条线段,然后设置半径为50.通过相交的两条线段的夹 角处画此半径的圆弧就可以确定圆弧了。*/ CGContextSaveGState(context); CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect)); //移动 改变这张画纸坐标轴的x,y偏移量 CGContextScaleCTM(context, ovalWidth, ovalHeight); //缩放 后两个参数是改变坐标轴x,y单位大小比例 fw = CGRectGetWidth(rect) / ovalWidth; fh = CGRectGetHeight(rect) / ovalHeight; CGContextMoveToPoint (context, fw, fh/2); // 在右下角开始 CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); // 右上角 CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); // 左上角 CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); // 左下角 CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // 回到右下角 CGContextClosePath(context); CGContextRestoreGState(context); }
id createImage(float percentage) { CGContextRef context = MyCreateBitmapContext(30, 30); addRoundedRectToPath(context, CGRectMake(0.0f, 0.0f, 30.0f, 30.0f), 4.0f, 4.0f); CGFloat gray[4] = {percentage, percentage, percentage, 1.0f}; CGContextSetFillColor(context, gray); CGContextFillPath(context); CGImageRef myRef = CGBitmapContextCreateImage (context); free(CGBitmapContextGetData(context)); CGContextRelease(context); return [UIImage imageWithCGImage:myRef]; }
-(BrightnessController *) initWithBrightness: (int) aBrightness { self = [super init]; brightness = aBrightness; self.title = [NSString stringWithFormat:@"%d%%", brightness * 10]; [self.tabBarItem initWithTitle:self.title image:createImage(((float) brightness / 10.0f)) tag:0]; return self; }
NSMutableArray *controllers = [[NSMutableArray alloc] init]; for (int i = 0; i < 11; i++) { BrightnessController *bControl = [[BrightnessController alloc] initWithBrightness:i]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:bControl]; nav.navigationBar.barStyle = UIBarStyleBlackTranslucent; [controllers addObject:nav]; [bControl release]; [nav release]; } /*可定制按钮 默认情况下,当按钮多于5个时,标签栏控制器允许拥护对按钮布局进行定制。要做到这一点,可以单击标有“更多”的标签, 然后单击随之出现的导航栏上的编辑按钮。你可以选择只对某些特定的标签进行定制,也可以完全禁止定制。要允许定制, 请将标签栏控制器的 customizableViewControllers 设置为一个数组,数组中包含有你希望用户进行定制的试图控制器:*/ UITabBarController *tbarController = [[UITabBarController alloc] init]; tbarController.viewControllers = controllers; tbarController.customizableViewControllers = controllers; tbarController.delegate = self;//这里有个代理 功能就是在你选择和更换试图的时候记录你的这次的操作一方便下次使用连续性和方便性 [window addSubview:tbarController.view];
二.有几个视图 就添加几个UIViewController的文件
在AppDelegate中
IViewController *viewController1 = [[File1 alloc]init]; UIViewController *viewController2 = [[File2 alloc]init]; UIViewController *viewController3 = [[File3 alloc]init]; UIViewController *viewController4 = [[File4 alloc]init]; UINavigationController *viewController5 =[[UINavigationController alloc] initWithRootViewController:[[File5 alloc]init]]; UITabBarController *tableBar = [[UITabBarController alloc] init]; tableBar.viewControllers = [NSArray arrayWithObjects:viewController1 , viewController2,viewController3,viewController4, viewController5,nil]; self.window.rootViewController = tableBar ;