iOS Graphics 编程

Apple提供了以下几个框架来进行Graphics 和 Animations编程

 1、UIKit

The high-level framework that allows developers to create views, windows, buttons, and other UI related components. It also incorporates some of the low-level APIs into an easier-to-use high-level API.

2、 Quartz 2D

The main engine running under the hood to facilitate drawing in iOS; UIKit usesQuartz.

3、Core Graphics

A framework that supports the graphics context (more on this later), loading images,drawing images, and so on.

4、 Core Animation

A framework that, as its name implies, facilitates animations in iOS.

 

 

 font families:

- (void) enumerateFonts{
for (NSString *familyName in [UIFont familyNames]){
  NSLog(@"Font Family = %@", familyName);
}
}

fontName:

复制代码
- (void) enumerateFonts{
for (NSString *familyName in [UIFont familyNames]){
  NSLog(@"Font Family = %@", familyName);
  for (NSString *fontName in
      [UIFont fontNamesForFamilyName:familyName]){
      NSLog(@"\t%@", fontName);
    }
  }
}
复制代码

加载字体:

UIFont *helveticaBold = [UIFont fontWithName:@"HelveticaNeue-Bold" size:12.0f];

画字:
首先创建一个UIView的子类,然后在drawRect方法中处理:

复制代码
#import "GraphicsViewControllerView.h"
@implementation GraphicsViewControllerView
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)drawRect:(CGRect)rect{
    // Drawing code
/* Load the color */
    UIColor *magentaColor =
    [UIColor colorWithRed:0.5f
        green:0.0f
        blue:0.5f
        alpha:1.0f];
/* Set the color in the graphical context */
    [magentaColor set];
    UIFont *helveticaBold =
    [UIFont fontWithName:@"HelveticaNeue-Bold" size:40.0f];
    NSString *myString = @"Some String";
    [myString drawAtPoint:CGPointMake(40, 180) withFont:helveticaBold];
/* Our string to be drawn */
    NSString *myString2 = @"I Learn Really Fast";
/* Draw the string using the font. The color has
already been set */
    [myString2 drawInRect:CGRectMake(100, /* x */
        120, /* y */
        100, /* width */
        200) /* height */
        withFont:helveticaBold];
}
- (void)dealloc{
    [super dealloc];
}
@en                    
复制代码
复制代码
#import "GraphicsViewControllerView.h"
@implementation GraphicsViewControllerView
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)drawRect:(CGRect)rect{ // Drawing code /* Load the color */ UIColor *magentaColor = [UIColor colorWithRed:0.5f green:0.0f blue:0.5f alpha:1.0f]; /* Set the color in the graphical context */ [magentaColor set]; UIFont *helveticaBold = [UIFont fontWithName:@"HelveticaNeue-Bold" size:40.0f]; NSString *myString = @"Some String"; [myString drawAtPoint:CGPointMake(40, 180) withFont:helveticaBold]; /* Our string to be drawn */ NSString *myString2 = @"I Learn Really Fast"; /* Draw the string using the font. The color has already been set */ [myString2 drawInRect:CGRectMake(100, /* x */ 120, /* y */ 100, /* width */ 200) /* height */ withFont:helveticaBold]; } - (void)dealloc{ [super dealloc]; } @en
复制代码

 

画图片:

复制代码
- (void)drawRect:(CGRect)rect{
// Drawing code
/* Assuming the image is in your app bundle
and we can load it */
    UIImage *xcodeIcon =[UIImage imageNamed:@"Xcode.png"];
    [xcodeIcon drawAtPoint:CGPointMake(0.0f,20.0f)];
    [xcodeIcon drawInRect:CGRectMake(50.0f,
    10.0f,
    40.0f,
    35.0f)];
}
复制代码

画线:

复制代码


- (void)drawRect:(CGRect)rect{

//
Drawing code /* Set the color that we want to use to draw the line */ [[UIColor brownColor] set]; /* Get the current graphics context */ CGContextRef currentContext = UIGraphicsGetCurrentContext(); /* Set the width for the line */ CGContextSetLineWidth(currentContext,5.0f); /* Start the line at this point */ CGContextMoveToPoint(currentContext,50.0f,10.0f); /* And end it at this point */ CGContextAddLineToPoint(currentContext,100.0f,200.0f); /* Use the context's current color to draw the line */ CGContextStrokePath(currentContext); }
复制代码

PATH:

 Here are the methods you have to work with:

CGPathCreateMutable function

Creates a new mutable path of type CGMutablePathRef and returns its handle. We

should dispose of this path once we are done with it, as you will soon see.

CGPathMoveToPoint procedure

Moves the current pen position on the path to the point specified by a parameter

of type CGPoint.

CGPathAddLineToPoint procedure

Draws a line segment from the current pen position to the specified position (again,

specified by a value of type CGPoint).

CGContextAddPath procedure

Adds a given path (specified by a path handle) to a graphics context, ready for

drawing.

CGContextDrawPath procedure

Draws a given path on the graphics context.

CGPathRelease procedure

Releases the memory allocated for a path handle.

CGPathAddRect procedure

Adds a rectangle to a path. The rectangle’s boundaries are specified by a CGRect

structure.

 

 There are three important drawing methods that you can ask the CGContextDrawPath

 procedure to perform:

kCGPathStroke

 Draws a line (stroke) to mark the boundary or edge of the path, using the currently

selected stroke color.

kCGPathFill

 Fills the area surrounded by the path with the currently selected fill color.

kCGPathFillStroke

 Combines stroke and fill. Uses the currently selected fill color to fill the path, and

the currently selected stroke color to draw the edge of the path. We’ll see an example

of this method in the following section

 

复制代码
- (void)drawRect:(CGRect)rect{
// Drawing code
/* Create the path */
    CGMutablePathRef path = CGPathCreateMutable();
/* How big is our screen? We want the X to cover
the whole screen */
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
/* Start from top-left */
    CGPathMoveToPoint(path,NULL,screenBounds.origin.x,screenBounds.origin.y);
/* Draw a line from top-left to
bottom-right of the screen */
    CGPathAddLineToPoint(path,NULL,screenBounds.size.width,screenBounds.size.height);
/* Start another line from top-right */
CGPathMoveToPoint(path,NULL,screenBounds.size.width,screenBounds.origin.y);
/* Draw a line from top-right to bottom-left */
    CGPathAddLineToPoint(path,NULL,screenBounds.origin.x,screenBounds.size.height);
/* Get the context that the path has to be
drawn on */
    CGContextRef currentContext =UIGraphicsGetCurrentContext();
/* Add the path to the context so we can
draw it later */
    CGContextAddPath(currentContext,path);
/* Set the blue color as the stroke color */
  [[UIColor blueColor] setStroke];
/* Draw the path with stroke color */
    CGContextDrawPath(currentContext,kCGPathStroke);
/* Finally release the path object */
  CGPathRelease(path);
}
复制代码

 

画矩形:

复制代码
- (void)drawRect:(CGRect)rect{
// Drawing code
/* Create the path first. Just the path handle. */
    CGMutablePathRef path = CGPathCreateMutable();
/* Here are our rectangle boundaries */
    CGRect rectangle = CGRectMake(10.0f,10.0f,200.0f,300.0f);
/* Add the rectangle to the path */
    CGPathAddRect(path,NULL,rectangle);
/* Get the handle to the current context */
    CGContextRef currentContext =UIGraphicsGetCurrentContext();
/* Add the path to the context */
    CGContextAddPath(currentContext,path);
/* Set the fill color to cornflower blue */
    [[UIColor colorWithRed:0.20fgreen:0.60f blue:0.80f alpha:1.0f] setFill];
/* Set the stroke color to brown */
    [[UIColor brownColor] setStroke];
/* Set the line width (for the stroke) to 5 */
    CGContextSetLineWidth(currentContext,5.0f);
/* Stroke and fill the path on the context */
    CGContextDrawPath(currentContext,kCGPathFillStroke);
/* Dispose of the path */
    CGPathRelease(path);
}
复制代码

给图形增加阴影:

复制代码
- (void) drawRectAtTopOfScreen{
/* Get the handle to the current context */
    CGContextRef currentContext =
UIGraphicsGetCurrentContext();

  CGContextSaveGState(currentContext);

    CGContextSetShadowWithColor(currentContext,
CGSizeMake(10.0f, 10.0f),20.0f,[[UIColor grayColor] CGColor]);
/* Create the path first. Just the path handle. */
    CGMutablePathRef path = CGPathCreateMutable();
/* Here are our rectangle boundaries */
    CGRect firstRect = CGRectMake(55.0f,60.0f,150.0f,150.0f);
/* Add the rectangle to the path */
    CGPathAddRect(path,NULL,firstRect);
/* Add the path to the context */
    CGContextAddPath(currentContext,path);
/* Set the fill color to cornflower blue */
    [[UIColor colorWithRed:0.20fgreen:0.60f,blue:0.80f,alpha:1.0f] setFill];
/* Fill the path on the context */
    CGContextDrawPath(currentContext,kCGPathFill);
/* Dispose of the path */
    CGPathRelease(path);

  CGContextRestoreGState(currentContext);

}
复制代码

Gradients:

复制代码
- (void)drawRect:(CGRect)rect{
// Drawing code
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(currentContext);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    UIColor *startColor = [UIColor orangeColor];
    CGFloat *startColorComponents = (CGFloat *)CGColorGetComponents([startColor CGColor]);
    UIColor *endColor = [UIColor blueColor];
    CGFloat *endColorComponents = (CGFloat *)CGColorGetComponents([endColor CGColor]);
    CGFloat colorComponents[8] = {
/* Four components of the orange color (RGBA) */
    startColorComponents[0],
    startColorComponents[1],
    startColorComponents[2],
    startColorComponents[3], /* First color = orange */
/* Four components of the blue color (RGBA) */
    endColorComponents[0],
    endColorComponents[1],
    endColorComponents[2],
    endColorComponents[3], /* Second color = blue */
  };
    CGFloat colorIndices[2] = {
    0.0f, /* Color 0 in the colorComponents array */
    1.0f, /* Color 1 in the colorComponents array */
  };
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace,(const CGFloat *)&colorComponents,(const CGFloat *)&colorIndices,2);
  CGColorSpaceRelease(colorSpace);
  CGPoint startPoint, endPoint;
  startPoint = CGPointMake(120,260);
  endPoint = CGPointMake(200.0f,220);
    CGContextDrawLinearGradient(currentContext,gradient,startPoint,endPoint,kCGGradientDrawsBeforeStartLocation |kCGGradientDrawsAfterEndLocation);
  CGGradientRelease(gradient);   CGContextRestoreGState(currentContext); }
复制代码

 

Displacing Shapes

复制代码
- (void)drawRect:(CGRect)rect{ // Drawing code
/* Create the path first. Just the path handle. */               
CGMutablePathRef path = CGPathCreateMutable(); /* Here are our rectangle boundaries */

CGRect rectangle = CGRectMake(10.0f, 10.0f,200.0f, 300.0f); /* We want to displace the rectangle to the right by 100 points but want to keep the y position untouched */ CGAffineTransform transform = CGAffineTransformMakeTranslation(100.0f,0.0f); /* Add the rectangle to the path */
CGPathAddRect(path,
&transform, rectangle); /* Get the handle to the current context */ CGContextRef currentContext = UIGraphicsGetCurrentContext(); /* Add the path to the context */
CGContextAddPath(currentContext,path);
/* Set the fill color to cornflower blue */
[[UIColor colorWithRed:0.20f   green:0.60f blue:0.80f   alpha:1.0f] setFill]; /* Set the stroke color to brown */
[[UIColor brownColor] setStroke];
/* Set the line width (for the stroke) to 5 */
CGContextSetLineWidth(currentContext,
5.0f); /* Stroke and fill the path on the context */
CGContextDrawPath(currentContext,kCGPathFillStroke);
/* Dispose of the path */
CGPathRelease(path); }
复制代码
复制代码
- (void)drawRect:(CGRect)rect{ // Drawing code
/* Create the path first. Just the path handle. */ 
CGMutablePathRef path = CGPathCreateMutable(); /* Here are our rectangle boundaries */
CGRect rectangle = CGRectMake(10.0f, 10.0f,200.0f, 300.0f); /* Add the rectangle to the path */
CGPathAddRect(path,NULL, rectangle);
/* Get the handle to the current context */
CGContextRef currentContext = UIGraphicsGetCurrentContext(); /* Save the state of the context to revert back to how it was at this state, later */ CGContextSaveGState(currentContext); /* Translate the current transformation matrix to the right by 100 points */ CGContextTranslateCTM(currentContext, 100.0f,0.0f); /* Add the path to the context */
CGContextAddPath(currentContext,path);
/* Set the fill color to cornflower blue */
[[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; /* Set the stroke color to brown */
[[UIColor brownColor] setStroke];
/* Set the line width (for the stroke) to 5 */
CGContextSetLineWidth(currentContext,
5.0f); /* Stroke and fill the path on the context */
CGContextDrawPath(currentContext,kCGPathFillStroke);
/* Dispose of the path */
CGPathRelease(path);
/* Restore the state of the context */
CGContextRestoreGState(currentContext); }
复制代码

 

 

Scaling Shapes

/* Scale the rectangle to half its size */ 
CGAffineTransform transform = CGAffineTransformMakeScale(0.5f, 0.5f); /* Add the rectangle to the path */
CGPathAddRect(path,
&transform, rectangle);
复制代码
- (void)drawRect:(CGRect)rect{
// Drawing code
/* Create the path first. Just the path handle. */ 
CGMutablePathRef path = CGPathCreateMutable(); /* Here are our rectangle boundaries */
CGRect rectangle = CGRectMake(10.0f, 10.0f,200.0f, 300.0f); /* Add the rectangle to the path */
CGPathAddRect(path,NULL, rectangle);
/* Get the handle to the current context */ CGContextRef currentContext = UIGraphicsGetCurrentContext(); /* Scale everything drawn on the current graphics context to half its size */ CGContextScaleCTM(currentContext, 0.5f,0.5f); /* Add the path to the context */
CGContextAddPath(currentContext,path);
/* Set the fill color to cornflower blue */
[[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; /* Set the stroke color to brown */
[[UIColor brownColor] setStroke];
/* Set the line width (for the stroke) to 5 */
CGContextSetLineWidth(currentContext,
5.0f); /* Stroke and fill the path on the context */
CGContextDrawPath(currentContext,kCGPathFillStroke);
/* Dispose of the path */ CGPathRelease(path); }
复制代码

 

Rotating Shapes

/* Rotate the rectangle 45 degrees clockwise */ CGAffineTransform transform =
CGAffineTransformMakeRotation((45.0f * M_PI) / 180.0f);
/* Add the rectangle to the path */ 
CGPathAddRect(path,
&transform, rectangle);

 

posted @   shangdahao  阅读(2926)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示