五.Foundation框架(1)--NSSize NSPoint NSRange NSRect 結構體

在講述框架以前,咱們能夠想象一個問題,那就是爲何咱們每次建立文件的時候,都去選擇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;
}
相關文章
相關標籤/搜索