IOS开发中的CGFloat、CGPoint、CGSize和CGRect

http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGGeometry/Reference/reference.html

CGGeometry类定义几何元素的结构和操作几何元素的函数。

1、数据类型:

CGFloat: 浮点值的基本类型
CGPoint: 表示一个二维坐标系中的点
CGSize: 表示一个矩形的宽度和高度
CGRect: 表示一个矩形的位置和大小

typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit

struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CGPoint CGPoint;

struct CGSize {
    CGFloat width;
    CGFloat height;
};
typedef struct CGSize CGSize;

struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CGRect CGRect;

注意:CGRect数据结构的高度和宽度可以是负数。例如,一个矩形的原点是[0.0,0.0]和大小是[10.0,10.0]。这个矩形完全等同原点是[10.0,10.0]和大小是[-10.0,-10.0]的矩形。

2、使用值来创建几何元素的方法

CGPointMake
CGRectMake
CGSizeMake

CGPoint CGPointMake (
   CGFloat x,
   CGFloat y
);

CGSize CGSizeMake (
   CGFloat width,
   CGFloat height
);

CGRect CGRectMake (
   CGFloat x,
   CGFloat y,
   CGFloat width,
   CGFloat height
);
CGFloat ten=10.0f;
CGPoint point = CGPointMake(0.0f, 0.0f);
CGSize size = CGSizeMake(10.0f, 10.0f);
CGRect rect = CGRectMake(point.x, point.y, size.width, size.height);
NSLog(@"ten: %f", ten);
NSLog(@"point: %@", NSStringFromCGPoint(point));
NSLog(@"size: %@", NSStringFromCGSize(size));
NSLog(@"rect: %@", NSStringFromCGRect(rect));

CGFloat和float的区别

相信在定义数据类型的时候可能会有类似的疑惑,CGFloat和float到底有什么区别,什么时候该用哪一种?

CGFloat is just a typedef for either float or double.
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
对于需要兼容64位机器的程序而言,需要用CGFloat,当然从长远角度考虑还是推荐尽量使用CGFloat。尽管在32位上相比float增加了一些memory footprint的消耗。

对应64位编程的时候,

对于整数应使用NSInteger和NSUInteger,而非int

对于小数应使用CGFloat,而非float

NSInteger其实是一个自动定义,在32位中为int,而64位中为long。

CGFloat的原理类似。

用NSDateFormatter格式化时间

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理。
例如:

//实例化一个NSDateFormatter对象

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

//设定时间格式,这里可以设置成自己需要的格式

[dateFormatter setDateFormat:@”yyyy-MM-dd HH:mm:ss”];

//用[NSDate date]可以获取系统当前时间

NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];

//输出格式为:2010-10-27 10:22:13

NSLog(@”%@”,currentDateStr);

//alloc后对不使用的对象别忘了release

[dateFormatter release];

viewWillApperar和ViewDidApper

在iPhone开发中,每当视图准备在屏幕上显示或者视图已在屏幕上完全显示时将调用这两个方法。

viewWillApperar—更新准备显示得视图信息,调用时视图可能还没有被加载。

ViewDidApper—来触发视图完全显示在屏幕上之后得行为,切换视图会被调用

 

viewWillAppear:
Called when the view is about to made visible. Default does nothing
视图即将可见时调用。默认情况下不执行任何操作
viewDidAppear:
Called when the view has been fully transitioned onto the screen. Default does nothing
视图已完全过渡到屏幕上时调用
viewWillDisappear:
Called when the view is dismissed, covered or otherwise hidden. Default does nothing
视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
viewDidDisappear:
Called after the view was dismissed, covered or otherwise hidden. Default does nothing
视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作

Objective-C中的@Selector

其作用相当于函数指针,现在我看到的大多说用法都是在调用某些函数需要传递一个 函数指针 参数时,使用@selector。它会在当前类里面查找selector后面所跟的函数,返回一个SEL类型的值。

SEL变量的执行.用performSelecor方法来执行.

[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];

在调用respondsToSelector:@selector(method)时,这个method只有在该方法存在参数时需要 “:”,如果该方法不需要参数就不需要加这个冒号。否则,编译不会报错,只是执行返回的值不对。当然如果方法有多个参数,需要多个冒号,参数有名称的需要带上参数名称。

如:有如下方法:

-(NSString*)toXmlString;

此时调用类似于:

[self respondsToSelector:@selector(toXmlString)]

如果toXmlString方法的定义为:

-(NSString*)toXmlString:(NSString*)prefix;

那么调用就必须加上冒号,如:[self respondsToSelector:@selector(toXmlString:)]

  • -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例
  • -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例
  • -(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
  • +(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上.
  • -(id) performSelector: selector 执行某个方法

UILineBreakMode的各种情况分析

typedef enum {
UILineBreakModeWordWrap = 0,
UILineBreakModeCharacterWrap,
UILineBreakModeClip,
UILineBreakModeHeadTruncation,
UILineBreakModeTailTruncation,
UILineBreakModeMiddleTruncation,
} UILineBreakMode;

UILineBreakModeWordWrap = 0,
以单词为单位换行,以单位为单位截断。
UILineBreakModeCharacterWrap,
以字符为单位换行,以字符为单位截断。
UILineBreakModeClip,
以单词为单位换行。以字符为单位截断。
UILineBreakModeHeadTruncation,
以单词为单位换行。如果是单行,则开始部分有省略号。如果是多行,则中间有省略号,省略号后面有4个字符。
UILineBreakModeTailTruncation,
以单词为单位换行。无论是单行还是多行,都是末尾有省略号。
UILineBreakModeMiddleTruncation,
以单词为单位换行。无论是单行还是多行,都是中间有省略号,省略号后面只有2个字符。

The run destination My Mac 64-bit is not valid for Running the scheme ‘*’.

XCode4.2有个一毛病,就是从版本控制器上更新代码后出现不能编译:“he run destination My Mac 64-bit is not valid for Running the scheme ‘*’.”

一般的解决方法:
先换低版本的“Deployment Target”编译,然后再换回原来的本版,如我的原来的“Deployment Target”是5.0 我换成4.3编译成功之后再换回来就轻松搞定了

解决发布app程序的CFBundleLocalizations错误

今天刚好发布app程序。碰到一个之前没碰到过的问题。在程序打包后验证的过程中,弹出了一个CFBundleLocalizations的错误。网上找了一下,知道大概是多语言的问题。尝试了网上提到的两种方法:

1、修改Info.plist里面的设置,我是直接打开Info.plist修改的如图,添加了一个数组,然后写上你的程序支持的语言就OK 了。

<key>CFBundleLocalizations</key>
<array>
<string>zh_CN</string>
<string>en</string>
</array>

按这种方式试了,可以通过发布前的验证,但在设备上运行,一启动就退出了。看来这不是一个好的解决办法。

来源地址:http://www.iloss.me/?p=777

又尝试了另外一种方法。

直接将Localizations这个段删了,可以用文本打开Info.plist删,也可以在xcode里面删。

这个方法反而ok了。多语言支持没问题,程序启动也正常。

来源地址:

http://rainbird.blog.51cto.com/211214/661556

 

分享百度网盘邀请码

http://pan.baidu.com/netdisk/beinvited?invite_code=d69013ae9fdd9694c113abe298088758

http://pan.baidu.com/netdisk/beinvited?invite_code=776fe027372ffb54f2a25a8414ad677f

http://pan.baidu.com/netdisk/beinvited?invite_code=75aaad0b196bda5d54a3526e95267c76

http://pan.baidu.com/netdisk/beinvited?invite_code=ccb0bd566382f49e8290a82729b4b2ce

http://pan.baidu.com/netdisk/beinvited?invite_code=68562a797e78e191a94be1cd8438a900

http://pan.baidu.com/netdisk/beinvited?invite_code=2c66284202bdbeaa7d17861a52ed838b

http://pan.baidu.com/netdisk/beinvited?invite_code=dcbf9713e79c85aebb3c170c0e10a9f3

http://pan.baidu.com/netdisk/beinvited?invite_code=ef6b73afec7217f8ddaa0e759e6ede76

http://pan.baidu.com/netdisk/beinvited?invite_code=e1d6d3f3f0b2f1fa4426a2298675adbb

http://pan.baidu.com/netdisk/beinvited?invite_code=f35e14223d3f64afe2b9ede158d672fc