五.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;
}
相关文章
相关标签/搜索