今天看了这个程序 下面是我对这个程序中代码的理解
如果有那个地方我理解的不太到位 还请赐教
1.让图片随即在什么地方出现
- (CGPoint) randomCenterInView: (UIView *) aView withInsets: (UIEdgeInsets) insets { CGRect innerRect = UIEdgeInsetsInsetRect([aView bounds], insets); //CGRect结构在屏幕上定义了一个矩形。 调整矩形 //bounds的坐标原点是(0,0) 但这个点不是指左上角的那个原点 而是相对于自己 //但frame的原点坐标是相对于父视图的 原点坐标不一定是(0,0); CGRect subRect = CGRectInset(innerRect, self.frame.size.width / 2.0f, self.frame.size.height / 2.0f); //floor取整数 float rx = (float)(random() % (int)floor(subRect.size.width)); float ry = (float)(random() % (int)floor(subRect.size.height)); return CGPointMake(rx + subRect.origin.x, ry + subRect.origin.y); }
- (CGPoint) randomCenterInView: (UIView *) aView withInset: (float) inset { //在本程序中UIEdgeInsetsMake指的是矩形的四角有多少不被利用 UIEdgeInsets insets = UIEdgeInsetsMake(inset, inset, inset, inset); return [self randomCenterInView:aView withInsets:insets]; }
#define COOKBOOK_PURPLE_COLOR [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f] #define BARBUTTON(TITLE, SELECTOR) [[[UIBarButtonItem alloc] initWithTitle:TITLE style:UIBarButtonItemStylePlain target:self action:SELECTOR] autorelease]
void centerText(CGContextRef context, NSString *fontname, float textsize, NSString *text, CGPoint point, UIColor *color) { //使用Quartz时涉及到一个图形上下文,其中图形上下文中包含一个保存过的图形状态堆栈。 //在Quartz创建图形上下文时,该堆栈是空的。CGContextSaveGState函数的作用是将 //当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响 //存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆 //栈顶部的状态弹出,返回到之前的图形状态。这种推入和弹出的方式是回到之前图形状态的 //快速方法,避免逐个撤消所有的状态修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。 CGContextSaveGState(context); CGContextSelectFont(context, [fontname UTF8String], textsize, kCGEncodingMacRoman); //CGContextSelectFont函数有4个参数:一个图形上下文, //字体的PostScript字体名,字体大小(用户空间单位),以及文本的编码。 //检索文本宽度 CGContextSaveGState(context); CGContextSetTextDrawingMode(context, kCGTextInvisible); //调用CGContextSetTextDrawingMode函数将文本设置为kCGTextInvisible。 CGContextShowTextAtPoint(context, 0.0f, 0.0f, [text UTF8String], text.length); //与上一句话一起删除的话 会呈现和不删前同样的效果 //在绘制文本时,调用CGContextShowTextAtPoint函数。你调用CGContextSetFont //而不是CGContextSelectFont来指定字体,在CGContextSetFont中你并没有指定文本编码, //你也就不能使用CGContextShowTextAtPoint来绘制文本。 CGPoint endpoint = CGContextGetTextPosition(context); //调用CGContextGetTextPosition得到文本的结束位置。?????????????? CGContextRestoreGState(context); CGSize stringSize = [text sizeWithFont:[UIFont fontWithName:fontname size:textsize]]; //描绘数字 [color setFill]; CGContextSetShouldAntialias(context, true); //让字体渲染比较清晰 提高画质以使之柔和 CGContextSetTextDrawingMode(context, kCGTextFill); //kCGTextClip kCGTextInvisible这样中间没数字 kCGTextFill kCGTextFillClip有数字 //stroke描边kCGTextFillStroke kCGTextFillStrokeClip数字黑白相映 // kCGTextStroke kCGTextStrokeClip数字为空心的黑边 CGContextSetTextMatrix (context, CGAffineTransformMake(1, 0, 0, -1, 0, 0)); //从文本空间到用户控件的转换矩阵 删除的话数字是倒放的 CGContextShowTextAtPoint(context, point.x - endpoint.x / 2.0f, point.y + stringSize.height / 4.0f, [text UTF8String], text.length); //绘制文本 CGContextRestoreGState(context); }
- (UIImage *) createImageWithColor: (UIColor *) color { //创建一个基于位图的上下文(context),并将其设置为当前上下文(context)。 //参数为新创建的位图上下文的大小。 //UIGraphicsBeginImageContext (CGSize)截图 ,是从屏幕原点开始截 //取size大小的图片,如何截取任意 起点 开始 size 大小的图片 UIGraphicsBeginImageContext(CGSizeMake(SIDE_LENGTH, SIDE_LENGTH)); CGContextRef context = UIGraphicsGetCurrentContext(); // 画出一个圆 [color setFill]; CGContextAddEllipseInRect(context, CGRectMake(0.0f, 0.0f, SIDE_LENGTH, SIDE_LENGTH)); CGContextFillPath(context); // 颜色填充整个圆 // 画出圆圈中的数字 [[UIColor whiteColor] setFill]; NSString *numstring = [NSString stringWithFormat:@"%d", count++]; centerText(context, @"Georgia", 18.0f, numstring, CGPointMake(SIDE_LENGTH / 2.0f, SIDE_LENGTH / 2.0f), [UIColor whiteColor]); //圆圈里的数字 //描绘圆的边界 本程序用的是白线 CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); //如果没有的话则为默认用黑色填充边界 CGContextAddEllipseInRect(context, CGRectMake(INSET_AMT, INSET_AMT, SIDE_LENGTH - 2.0f * INSET_AMT, SIDE_LENGTH - 2.0f * INSET_AMT)); CGContextStrokePath(context); UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext(); //返回的图形大小 UIGraphicsEndImageContext(); return theImage; }
#define RANDLEVEL ((random() % 128) / 256.0f) - (void) add: (id) sender { UIColor *color = [UIColor colorWithRed:RANDLEVEL green:RANDLEVEL blue:RANDLEVEL alpha:1.0f]; UIImage *newimage = [self createImageWithColor:color]; UIImageView *newview=[[UIImageView alloc] initWithImage:newimage]; newview.center = [newview randomCenterInView:[self.view viewWithTag:101] withInset:0]; [[self.view viewWithTag:101] addSubview:newview]; [newview release]; }
- (void) viewDidLoad { srandom(time(0)); count = 1; self.navigationController.navigationBar.tintColor = COOKBOOK_PURPLE_COLOR; self.navigationItem.rightBarButtonItem = BARBUTTON(@"Add", @selector(add:)); UIView *outerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 240.0f, 240.0f)]; outerView.center = CGPointMake(160.0f, 140.0f); outerView.backgroundColor = [UIColor lightGrayColor]; outerView.tag = 101; [self.view addSubview:outerView]; [outerView release]; }