青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

逛奔的蝸牛

我不聰明,但我會很努力

   ::  :: 新隨筆 ::  ::  :: 管理 ::
Learn Quartz

Introduction to Quartz

Quartz is at the center of all graphics in Cocoa. It provides basic graphics data structures and drawing routines, as well Mac OS X's window server.

This beginner-level tutorial introduces basic Cocoa graphics concepts: rectangles, points, colors, and coordinate systems. 

This tutorial is written and illustrated by Scott Stevenson
 
Copyright © 2006 Scott Stevenson

Rectangles and Points

All drawing in Quartz involves rectangles. In Cocoa, you use the NSRectstruct to describe a rectangle's location and dimensions: 

(Rects don't automatically draw themselves. These are just diagrams to go with the examples.)
 
typedef struct { NSPoint origin; NSSize size; } NSRect; // make a rect at (0,0) which is 20x20 NSRect myRect; myRect.origin.x = 0; myRect.origin.y = 0; myRect.size.width = 20; myRect.size.height = 20;
 
The origin field is the "anchor point" of the rect, where the drawing starts. A point is described by NSPoint, which has x and y coordinates:
 
typedef struct { float x; float y; } NSPoint; // make three points on the canvas NSPoint point1; point1.x = 4; point1.y = 11; NSPoint point2; point2.x = 12; point2.y = 21; NSPoint point3; point3.x = 19; point3.y = 8;
 
The size field of a rect is an NSSize, which holds a width and a height. There's no way to depict an instance of NSSize, it has to be part of a rect to be useful.
 
typedef struct { float width; float height; } NSSize;
Much of 2D drawing in Cocoa is based on these three structs. Remember these are not Objective-C classes. You can't call methods on them directly, but there are functions that go with them. 

All measurements in Quartz are float values, which gives you finer control of drawing than integer-based coordinates.

Convenience Functions

Cocoa has a number of functions for creating geometry structs. Most of them are listed in Foundation's NSGeometry.h file.
 
// make a point at coordinate 20,20 NSPoint newPoint = NSMakePoint ( 20, 20 ); // make a size of 100 wide x 100 high NSSize newSize = NSMakeSize ( 100, 100 ); // use the previous point and size to make a rect NSRect newRect = NSMakeRect ( newPoint.x, newPoint.y, newSize.width, newSize.height ); // also can just do this NSRect newRect = NSMakeRect ( 20, 20, 100, 100 );
Using these functions instead of creating the structs manually makes the code a bit more obvious and makes searching easier.
 

Coordinates in Quartz

The drawing area of a view in Cocoa is treated as a rect. Quartz calls this drawing area the "bounds." An NSPoint can represent any location in the view bounds. 

The standard Quartz coordinate system is based on PDF model, which means drawing in a view starts in the bottom-left. This is what you see in geometry textbooks. 

Sometimes it's easier to write drawing code if the origin is in the top-left. This is how things work in web page design, for example. Quartz calls this a flipped coordinate system.
 
You can easily convert points between standard and flipped views using NSView's convertPoint:fromView: and convertPoint:toView: methods.

Rects as Objects

Because they're not objects, you can't store the geometry structs in an NSArray, NSDictionary, or NSSet directly, but you can wrap them in anNSValue object:
 
NSRect newRect = NSMakeRect ( 20, 20, 100, 100 ); NSValue * rectObject = [NSValue valueWithRect: newRect]; NSMutableArray * myArray = [NSMutableArray array]; [myArray addObject: rectObject]; NSRect originalRect = [[myArray objectAtIndex: 0] rectValue];
NSValue has similar methods for NSPoint and NSSize. You can also log information about rects using the NSStringFromRect function:
 
NSRect newRect = NSMakeRect ( 20, 20, 100, 100 ); NSLog (@"%@", NSStringFromRect( newRect ));
Another function, NSRectFromString takes a properly-formatted rect description and returns an NSRect. Both sets of functions also exist for NSPoint and NSSize.

Derived Rects

Cocoa provides functions to create new rects based on existing ones. Here's how to make a rect which has the same dimensions as the original, but is shifted down and to the right (offset).
 
// create a rect, then get the 5x5 offset NSRect rect1; rect1.origin.x = 0; rect1.origin.y = 0; rect1.size.width = 30; rect1.size.height = 25; NSRect rect2; rect2 = NSOffsetRect ( rect1, 5, 5 );
 
You can use negative values for the offset if you want to move in the opposite directions. 

Here's how to get the intersection area of two rects:
 
// get the common area between two rects NSRect rect1; rect1.origin.x = 0; rect1.origin.y = 0; rect1.size.width = 30; rect1.size.height = 25; NSRect rect2; rect2 = NSOffsetRect ( rect1, 5, 5 ); NSRect rect3; rect3 = NSIntersectionRect ( rect1, rect2 );
 
Here's how to create a rect which encloses two other rects (a union).
 
// get a combination of two rects NSRect rect1; rect1.origin.x = 0; rect1.origin.y = 0; rect1.size.width = 30; rect1.size.height = 25; NSRect rect2; rect2 = NSOffsetRect ( rect1, 5, 5 ); NSRect rect3; rect3 = NSUnionRect ( rect1, rect2 );
 
An inset rect is helpful if you want to create a outer boundry, then create a rect for the content inside:
 
// get a contracted version of a rect NSRect rect1; rect1.origin.x = 0; rect1.origin.y = 0; rect1.size.width = 30; rect1.size.height = 25; NSRect rect2; rect2 = NSInsetRect ( rect1, 5, 5 );
 

Comparing Rects and Points

Foundation provides a group of functions to check the equality of points and rects, as well as functions to see if points and rects are inside in other rects.
 
NSRect rect1; rect1.origin.x = 0; rect1.origin.y = 0; rect1.size.width = 30; rect1.size.height = 25; NSPoint point1 = NSMakePoint ( 8,21 ); BOOL isInRect; isInRect = NSPointInRect ( point1, rect1 );
 
Below is a table of the most useful comparison functions. All of these functions return a YES or NO value. 

Comparison Functions
NSEqualRects Are rects identical?
NSEqualPoints Are points identical?
NSEqualSizes Are sizes identical?
NSContainsRect Does the first rect contain the other?
NSIntersectsRect Do the rects at least partially overlap?
NSPointInRect Is the point inside the rect?
NSMouseInRect Is the mouse cursor in this rect?
NSIsEmptyRect Is the rect empty (no area)?


These functions are listed in Foundation's NSGeometry.h file.

Drawing

NSRects and NSPoints only describe geometry, they don't actually do drawing. Let's look at some primitive drawing functions in Cocoa's NSGraphics.h file.
 
NSColor * gray = [NSColor grayColor]; NSColor * white = [NSColor whiteColor]; // fill background [gray set]; NSRectFill ( [self bounds] ); // fill target rect NSRect rect1 = NSMakeRect ( 21,21,210,210 ); [white set]; NSRectFill ( rect1 );
 
The example above uses NSColor. When you call the -set method on a color object, Quartz uses it for all drawing until you set a new one. 

Here's how to draw a border around a rect:
 
NSColor * gray = [NSColor grayColor]; NSColor * white = [NSColor whiteColor]; // fill background [gray set]; NSRectFill ( [self bounds] ); // draw a border around target rect NSRect rect1 = NSMakeRect ( 21,21,210,210 ); [white set]; NSFrameRectWithWidth ( rect1, 1 );
 
You can also call NSFrameRect if you just want to use the default line width.
 

Drawing Groups

It's often faster to draw an array of rects all at once instead of calling NSRectFill for each one individually. 

Below is a more involved example which builds C-style arrays of NSRects and NSColors, then passes both to NSRectFillListWithColors.
 
// setup basics [[NSColor grayColor] set]; NSRectFill ( [self bounds] ); int count = 12; NSRect startingRect = NSMakeRect ( 21,21,50,50 ); // create arrays of rects and colors NSRect rectArray [count]; NSColor * colorArray[count]; rectArray [0] = startingRect; colorArray[0] = [NSColor redColor]; // populate arrays int i; NSRect oneRect = rectArray[0]; for ( i = 1; i < count; i++ ) { // move 100 pixels to the right oneRect.origin.x += 100; // if the right edge doesn't fit, move down 100 pixels if ( NSMaxX (oneRect) > NSMaxX ([self bounds]) ) { oneRect.origin.x = startingRect.origin.x; oneRect.origin.y += 100; } rectArray [i] = oneRect; // increment color colorArray[i] = [NSColor colorWithCalibratedHue: (i*0.04) saturation: 1 brightness: 0.9 alpha: 1]; } // use rect and color arrays to fill NSRectFillListWithColors ( rectArray, colorArray, count ); // draw a 2 pixel border around each rect [[NSColor whiteColor] set]; for ( i = 0; i < count; i++) { NSFrameRectWithWidth ( rectArray[i], 2 ); }
 
This example also uses the function NSMaxX to get the maximum x-axis value of the rect (right edge). If it's outside of the view bounds, we move down to the next row.
 

Wrap Up

We've covered basic Quartz concepts here. The next tutorial will dig into intermediate topics. You can download the final example here: 

IntroToQuartz Xcode 2.4 Project (52k) 

Love it? Suggestions? Send feedback on this tutorial. 

For further reading, check out Cocoa Graphics Part II
 
Copyright © 2004-2006 Scott Stevenson
Made with TextMate
Cocoa Dev Central is a servicemark of Tree House Ideas
Site design © 2004-2006 Scott Stevenson
From: http://www.cocoadevcentral.com/d/intro_to_quartz/
@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted on 2011-12-02 00:15 逛奔的蝸牛 閱讀(694) 評論(0)  編輯 收藏 引用 所屬分類: Cocoa
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清自拍一区| 欧美激情精品久久久久久黑人 | 国产老女人精品毛片久久| 日韩亚洲欧美成人一区| 亚洲第一福利视频| 亚洲第一区在线观看| 欧美成人免费在线观看| 最新国产成人在线观看| 亚洲美女精品一区| 一区二区三区免费在线观看| 中日韩视频在线观看| 亚洲婷婷综合色高清在线| 亚洲免费视频一区二区| 久久精品99| 欧美成人精品影院| 国产精品久久国产精品99gif| 国产精品丝袜白浆摸在线| 91久久精品国产91久久性色tv| 亚洲国产欧美国产综合一区| 亚洲人成高清| 亚洲视频一区在线观看| 欧美一区二区在线| 欧美一区二区视频网站| 久久美女性网| 亚洲啪啪91| 亚洲综合国产| 欧美大片在线看| 国产精品视频观看| 亚洲国产另类久久久精品极度| 一道本一区二区| 久久综合国产精品台湾中文娱乐网| 欧美黄色一区二区| 亚洲一区视频在线| 欧美激情按摩| 好吊色欧美一区二区三区四区| 亚洲高清av| 羞羞漫画18久久大片| 欧美激情一二区| 欧美一区二区三区精品电影| 欧美精品国产精品| 尤物在线观看一区| 午夜免费在线观看精品视频| 欧美国产日韩精品| 欧美中文在线视频| 国产精品理论片在线观看| 亚洲精品在线视频| 玖玖玖国产精品| 午夜精品一区二区三区在线播放 | 久久久久久久一区| 亚洲免费不卡| 欧美高清在线播放| 一区二区视频欧美| 欧美主播一区二区三区| 日韩视频免费在线| 玖玖玖国产精品| 国产一区二区你懂的| 亚洲尤物在线视频观看| 亚洲国产中文字幕在线观看| 久久精品一二三| 国产亚洲美州欧州综合国| 亚洲尤物视频网| 亚洲视频一区二区免费在线观看| 欧美激情精品久久久久| 1000部精品久久久久久久久| 久久久久久久久久看片| 午夜欧美精品| 国产美女精品视频| 欧美中文日韩| 欧美一区二区视频在线观看| 国产美女精品视频| 久久九九免费视频| 欧美在线视频二区| 国产一区99| 欧美成人嫩草网站| 国内精品伊人久久久久av影院| 亚洲第一区在线| 久久综合九色综合欧美就去吻| 香蕉久久一区二区不卡无毒影院| 国产精品成人免费视频| 香蕉av777xxx色综合一区| 亚洲综合精品自拍| 国产日产精品一区二区三区四区的观看方式 | 亚洲一区不卡| 亚洲综合日本| 亚洲第一网站免费视频| 亚洲黄一区二区| 国产精品久久久99| 久久视频在线视频| 欧美精品在线一区二区| 欧美一进一出视频| 麻豆精品在线观看| 这里是久久伊人| 欧美在线网址| 99国产精品久久久| 午夜精品久久久久久久白皮肤| 一区二区三区在线观看欧美| 亚洲看片免费| 影音先锋中文字幕一区二区| 亚洲激情影院| 国产三区二区一区久久| 91久久国产综合久久91精品网站| 国产精品theporn| 另类春色校园亚洲| 欧美日韩一区二区在线视频 | 免费一区二区三区| 欧美成人午夜剧场免费观看| 99视频在线观看一区三区| 亚洲日韩第九十九页| 国产精品第十页| 久久九九电影| 欧美亚洲一区二区三区| 欧美高清视频| 中文国产一区| 欧美.日韩.国产.一区.二区| 亚洲成色777777女色窝| 欧美大片在线观看| 欧美电影免费网站| 一区二区免费在线播放| 久久这里只有| 日韩亚洲综合在线| 野花国产精品入口| 国产区在线观看成人精品| 久久久久久久精| 国产精品一二三四| 欧美va天堂va视频va在线| 欧美高清在线一区二区| 亚洲专区免费| 久久精品国产99国产精品| 国产精品白丝jk黑袜喷水| 久久国产欧美日韩精品| 久久久之久亚州精品露出| 亚洲福利国产| 欧美日韩美女一区二区| 亚洲第一久久影院| 欧美日韩三级一区二区| 午夜精品久久久久久久白皮肤| 亚洲一区二区在线免费观看| 国产亚洲美州欧州综合国| 亚洲福利视频二区| 久久亚洲精品伦理| 亚洲香蕉视频| 麻豆乱码国产一区二区三区| 亚洲一区二区三区国产| 久久久久天天天天| 在线播放中文字幕一区| 久久婷婷av| 午夜精品一区二区三区在线播放| 久久久久久久久久久久久女国产乱 | 欧美福利一区| 亚洲高清在线精品| 国产欧美日韩精品专区| 亚洲欧洲美洲综合色网| 精品88久久久久88久久久| 日韩亚洲精品视频| 精品999在线播放| 欧美一区二区在线免费观看| 国产一区二区精品久久99| 99精品视频免费观看视频| 在线播放日韩欧美| 亚洲欧美日韩中文播放| 一本大道久久a久久综合婷婷| 美女黄毛**国产精品啪啪| 日韩小视频在线观看| 久久综合九色综合久99| 欧美有码在线观看视频| 国产精品久久7| 一本色道精品久久一区二区三区 | 黄色精品一区| 美女日韩在线中文字幕| 久久久久久久97| 国产麻豆9l精品三级站| 亚洲一区自拍| 欧美亚洲视频一区二区| 国产精品国产三级国产a| 久久精品亚洲乱码伦伦中文 | 免费永久网站黄欧美| 久久久久久穴| 亚洲一区二区三区视频| 国产一区二区三区高清| 亚洲欧美国产制服动漫| 亚洲在线电影| 欧美性做爰毛片| 亚洲天堂免费在线观看视频| 久久精品72免费观看| 久久国产精品亚洲va麻豆| 欧美偷拍一区二区| 一区二区欧美精品| 亚洲天堂成人在线视频| 美女爽到呻吟久久久久| 欧美国产日韩在线观看| 亚洲欧洲一区二区在线播放| 欧美第一黄网免费网站| 亚洲精品乱码久久久久久蜜桃91 | 欧美一区二区三区电影在线观看| 欧美黄色一区| 亚洲美女电影在线| 欧美成人免费播放| 一区二区三区精品视频在线观看 | 国产一区二区| 久久先锋资源|