在講述框架以前,咱們能夠想象一個問題,那就是爲何咱們每次建立文件的時候,都去選擇Cocoa Class或者Cocoa Touch Class 尼?編程
Cocoa 是什麼?框架
ocoa不是一種編程語言(它能夠運行多種編程語言),它也不是一個開發工具(經過命令行咱們仍然能夠開發Cocoa程序),它是建立Mac OS X和IOS程序的原生面向對象API,爲這二者應用提供了編程環境。編程語言
咱們一般稱爲「Cocoa框架」,事實上Cocoa自己是一個框架的集合,它包含了衆多子框架,其中最重要的要數「Foundation」和「UIKit」。前者是框架的基礎,和界面無關,其中包含了大量經常使用的API;後者是基礎的UI類庫,之後咱們在IOS開發中會常常用到。這兩個框架在系統中的位置以下圖:函數
其實全部的Mac OS X和IOS程序都是由大量的對象構成,而這些對象的根對象都是NSObject,NSObject就處在Foundation框架之中工具
一般咱們會將他們分爲幾類:佈局
值對象開發工具
集合測試
操做系統服務:文件系統、URL、進程通信atom
通知spa
歸檔和序列化
表達式和條件判斷
Objective-C語言服務
在C語言階段咱們已經學過結構了,而爲了簡化咱們的開發,Foundation框架爲咱們預先建立了不少,在開發中經常使用的結構體。這樣的話,咱們就沒必要要每次建立項目的時候都去建立一樣的代碼。
1.NSSize NSPoint NSRange NSRect
NSSize NSPoint NSRange NSRect 四種結構體,通常用於圖形方面
//圖形的寬高 NSSize nssize =NSMakeSize(3, 5); NSLog(@"width:%lf,height:%lf",nssize.width,nssize.height); //圖形的座標 NSPoint nspoint = NSMakePoint(3, 5); NSLog(@"x:%lf,y:%lf",nspoint.x,nspoint.y); // 範圍 NSRange nsrange = NSMakeRange(3, 5); NSLog(@"location:%ld,length:%ld",nsrange.location,nsrange.length); //圖形的座標和寬高 NSRect nsrect = NSMakeRect(5, 5, 100, 100); NSLog(@"x:%lf,y:%lf,width:%lf,height:%lf",nsrect.origin.x,nsrect.origin.y,nsrect.size.width,nsrect.size.height);
實例講解:
題目:
建立一個矩形類,建立一個自定義構造方法initWithFrame:(NSRect)rect
根據下圖,打印出圖形
0 1 2 3 4 5 6 7 8 9
1
2
3 * * * *
4 * * * *
5 * * * *
7 * * * *
8
9
#import <Foundation/Foundation.h> @interface Rectangle : NSObject #pragma mark 矩形的方位和寬高 @property (nonatomic,readwrite,assign)CGRect rect; /** * 初始化佈局 * * @param newRect 新的佈局 * * @return */ - (id)initWithFrame:(CGRect)newRect; /** * 顯示圖形 */ - (void)display; @end #import "Rectangle.h" @implementation Rectangle - (id)initWithFrame:(CGRect)newRect { if(self = [super init]) { [self setRect:newRect]; 等同於 self.rect = newRect } return self; } - (void)display { for (int i = 0; i<=9; i++) { for (int j = 0; j<=9;j++) { if(i==0) printf("%d",j); else if(j==0&&i!=0) printf("%d",i); else if(j>=self.rect.origin.x&& i>=self.rect.origin.y&& j<self.rect.origin.x+self.rect.size.width&& i<self.rect.origin.y+self.rect.size.height) { printf("*"); }else printf(" "); } printf("\n"); } } @end //main函數測試 int main(int argc, const char * argv[]) { @autoreleasepool { Rectangle *rect = [[Rectangle alloc]initWithFrame:(CGRect){4,6,4,4}]; [rect display]; } return 0; }運行結果:
2016-04-11 12:55:01.481 oc_single[1931:91316] 調用
0123456789
1
2
3
4
5
6 ****
7 ****
8 ****
9 ****
Program ended with exit code: 0
該類結構主要適用於UI控件的方位和大小調控。
經過上面實例,咱們再增長一個系列, 建立一個矩形,建立自定義構造方法設定它的佈局,而後每隔2秒,讓它移動向下移動一釐米。
將main函數的代碼替換掉:
#import "Rectangle.h" int main(int argc, const char * argv[]) { @autoreleasepool { int y = 0; Rectangle *rect = [[Rectangle alloc]initWithFrame:(CGRect){0,y,4,4}]; NSDate *startTime = [NSDate date]; 開始時間 NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; NSInteger interval = [timeZone secondsFromGMTForDate:startTime]; 開始時間設置 startTime = [startTime dateByAddingTimeInterval:interval]; NSLog(@"%@",startTime); NSDate* endTime = [NSDate date]; while (1) { 獲取結束時間 endTime = [NSDate date]; endTime = [endTime dateByAddingTimeInterval:interval]; 判斷結束時間和開始時間的時間差 int ret = (int)[endTime timeIntervalSinceDate:startTime]; if(ret==2) { 獲取圖形的佈局 CGRect tempRect = [rect rect]; 讓這個佈局的y座標向下移動 tempRect.origin.y++; tempRect.origin.x++; 從新設置圖形的佈局 [rect setRect:tempRect]; 顯示這個佈局 [rect display]; 讓開始時間變成結束 startTime = endTime; } } } return 0; }