五.Foundation框架(1)--NSSize   NSPoint   NSRange   NSRect 结构体

守給你的承諾、 提交于 2019-12-07 04:30:58

在讲述框架之前,我们可以想象一个问题,那就是为什么我们每次创建文件的时候,都去选择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、进程通讯

通知

归档和序列化

表达式和条件判断

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;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!