1. 让下面图层可以触摸
searchImage.exclusiveTouch = YES;//第一层
searchImage.userInteractionEnabled = NO;
myMapView.exclusiveTouch = NO;//第二层
myMapView.userInteractionEnabled = YES;
2. 设置状态栏
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];//隐藏状态栏
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];//设置状态栏透明
3. 判断网络是否连接
+(BOOL)isExistenceNetwork{
BOOL isExistenceNetwork;
Reachability *reachability=[Reachability reachabilityWithHostName:@""];
switch ([reachability currentReachabilityStatus]) {
case NotReachable:
isExistenceNetwork=FALSE;
break;
case ReachableViaWWAN:
isExistenceNetwork=TRUE;
break;
case ReachableViaWiFi:
isExistenceNetwork=TRUE;
break;
}
return isExistenceNetwork;
}
注:需要导入Reachability类
4. 实时通知网络状况
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
....................
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
reachability=[[Reachability reachabilityWithHostName:@"www.baidu.com"] retain];
[reachability startNotifier];
return YES;
}
-(void)reachabilityChanged:(NSNotification *)notification{
Reachability *curReachability=[notification object];
NSParameterAssert([curReachability isKindOfClass:[Reachability class]]);
NetworkStatus curStatus=[curReachability currentReachabilityStatus];
if (curStatus==NotReachable) {
[DOIN_Util logFax:@"连接失败"];
}
}
注:以上需要Reachability类在2.0以上才可以适用
6. 显示和隐藏UITabBarController
secondViewController.hidesBottomBarWhenPushed=YES
其中的secondViewController为需要隐藏tabbar的视图,如果全部视图都需要隐藏,那么可以使用self.hidesBottomBarWhenPushed=YES来实现。
注:缺点就是隐藏tabbar的视图不能在显示tabbar。
7. UINavigationController显示为透明状态或者隐藏
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent
其中 navigationController为一个UINavigationController对象,通过上述代码可以使导航栏背景处于透明状态。
[self.navigationController setNavigationBarHidden:NO animated:YES];
上述代码可以把navigationController隐藏起来,如果把其中的NO改为YES就可以显示出来
8. UINavigationController中的toolbar设置透明 [self.navigationController.toolbar setTranslucent:YES];设置为透明
9. 在iPhone App中提醒用户打分或写评价的方法
用户使用了软件却不到 App Store 打分或是写评论是很令开发者头疼的。下面这个方法能在 iPhone App 中集成提醒功能,弹出文字框来提示没有打分的用户。
主要代码
[[CloudReview sharedReview]reviewFor:395519376];
CloudReview.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CloudReview : NSObject {
int m_appleID;
}
+(CloudReview*)sharedReview;
-(void) reviewFor:(int)appleID;
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
@end
CloudReview.m
#import "CloudReview.h"
@implementation CloudReview
static CloudReview* _sharedReview = nil;
+(CloudReview*)sharedReview
{
@synchronized([CloudReview class])
{
if (!_sharedReview)
[[self alloc] init];
return _sharedReview;
}
return nil;
}
+(id)alloc
{
@synchronized([CloudReview class])
{
NSAssert(_sharedReview == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedReview = [super alloc];
return _sharedReview;
}
return nil;
}
-(void)reviewFor:(int)appleID
{
m_appleID = appleID;
BOOL neverRate = [[NSUserDefaults standardUserDefaults] boolForKey:@"neverRate"];
if(neverRate != YES) {
//Show alert here
UIAlertView *alert;
alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"rate_title",@"Rate My Appication")
message:NSLocalizedString(@"rate_main",@"Please Rate my Application")
delegate: self
cancelButtonTitle:NSLocalizedString(@"rate_cancel",@"Cancel")
otherButtonTitles: NSLocalizedString(@"rate_now",@"Rate Now"),
NSLocalizedString(@"rate_never",@"Never Rate"), nil];
[alert show];
[alert release];
}
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// Never Review Button
if (buttonIndex == 2)
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"neverRate"];
}
// Review Button
else if (buttonIndex == 1)
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"neverRate"];
NSString *str = [NSString stringWithFormat:
@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d",
m_appleID ];
NSLog(str);
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
}
}
@end
10. 怎样使UISearchBar背景透明
在使用UISearchBar时,将背景色设定为clearColor,或者将translucent设为YES,都不能使背景透明,经过一番研究,发现了一种超级简单和实用的方法:
| [[searchbar.subviews objectAtIndex:0]removeFromSuperview]; |
背景完全消除了,只剩下搜索框本身了。
11. 不通过App Store发布程序
在一些情况下,我们需要不通过App Store发布程序,比如:
1. 发布前的测试
2. 企业内部自用软件,不需要发布到App Store
非正规的做法当然是“越狱”,但是更为正式的做法是使用Ad-Hoc。至于怎样创建Ad-Hoc provision文件,不在本文讨论的范围内。本文讨论的是怎样安装Ad-hoc发布的程序。通常的做法是:
1. 开发者将Xcode编译的Ad-Hoc程序.app文件压缩后与.mobileprovision一起传给用户。
2. 用户拖动.mobileprovision文件到iTunes下的资料库 → 应用程序中
3. 将压缩的.app文件解压,然后将整个.app文件夹拖动到iTunes下的资料库 → 应用程序中
通常这对于Mac用户没有什么问题,但有时Windows用户会遇到一些问题。所以更好的做法是将.app制作成.ipa与.mobileprovision文件一同寄给用户。下面是制作ipa的步骤:
mkdir Payload
cp -rp MyApplication.app Payload/
zip -r MyApplication.ipa iTunesArtwork Payload
需要注意的是这里使用的是zip命令而不是Find中“Compress”选项,因为它会添加一些额外的内容。另外iTunesArtwork是一个512×512的png文件(注意无后缀),它将在iTunes中增加一个图标,所以这并不是必需的。
12. 宏的使用
注:宏的使用可以节省代码重复输入工作,还可以为调试带来各种好处。本文列出了几个非常简单实用的宏。
这些是我在Xcode中常用到的宏:
CMLog: 用它来代替NSLog:
1 | #define CMLog(format, ...) NSLog(@"%s:%@", __PRETTY_FUNCTION__,[NSString stringWithFormat:format, ## __VA_ARGS__]); |
它的作用是将调用它的类和方法的名称一起输出到控制台。比如你在MyAppDelegate类的applicationDidFinishLaunching方法中调用它:
1 | CMLog(@"My iPhone is an %@, v %@", [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion]); |
控制台将输出:
2009-01-05 10:06:28.957 MyApp15173:20b] -[MyAppDelegate applicationDidFinishLaunching:]:
My iPhone is an iPhone Simulator, v 2.2
MARK: 此宏用于输出调用它的类和方法名称。适用于只想知道是否一个方法被调用了。
1 | #define MARK CMLog(@"%s", __PRETTY_FUNCTION__); |
START_TIMER和END_TIMER: 用于确定一个方法或一段代码的运行时间:
1 2 | #define START_TIMER NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; #define END_TIMER(msg) NSTimeInterval stop = [NSDate timeIntervalSinceReferenceDate]; CMLog([NSString stringWithFormat:@"%@ Time = %f";, msg, stop-start]); |
将START_TIMER 置于需评测的代码段开始处,并将END_TIMER置于代码段结束处,你就可获得这段代码的运行时间:
1 2 3 4 5 6 7 | - (NSData *)loadDataFromURL:(NSString *)dataURL { START_TIMER; NSData *data = [self doSomeStuff:dataURL]; END_TIMER(@"loadDataFromURL"); return data; } |
输出为:
2009-01-05 10:31:37.943 MyApp[15283:20b] -[MyAppDelegate loadDataFromURL:]:
loadDataFromURL Time = 3.636021
将所有这些宏定义整理使用条件标志放在预编译的头文件中。调试时,此标志设为1 ,发布时将其设为0 。
1 2 3 4 5 6 7 8 9 10 | #if DEBUG==1 #define CMLog(format, ...) NSLog(@"%s:%@";, __PRETTY_FUNCTION__,[NSString stringWithFormat:format, ## __VA_ARGS__]); #define MARK CMLog(@"%s";, __PRETTY_FUNCTION__); #define START_TIMER NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; #define END_TIMER(msg) NSTimeInterval stop = [NSDate timeIntervalSinceReferenceDate]; CMLog([NSString stringWithFormat:@"%@ Time = %f";, msg, stop-start]); #else #define CMLog(format, ...) #define MARK #define START_TIMER #define END_TIMER(msg) #endif |
在Debug目标设定中加入:
OTHER_CFLAGS = -DDEBUG=1
在Release目标设定中加入:
OTHER_CFLAGS = -DDEBUG=0
13. 国际化
语言文件翻译好以后,将英语文件拖入项目中,再右击->Get Info,选择Make Localization。XCode会自动拷贝文件到English.lproj目录下。再添加其它语言。
在编译程序后,运行在iPhone上,程序会根据当前系统设置的语言来自动选择相应的语言包。
注意:genstrings产生的文件拖入XCode中可能是乱码,这时只要在XCode中右击文件->Get Info->General->File Encoding下选择UTF-16即可解决。
14. 文字宽度和高度以及行数
-(CGSize)textSize:(NSString *)text{
UIFont *font=[UIFont systemFontOfSize:20];
CGSize size=[text sizeWithFont:font constrainedToSize:self.frame.size
lineBreakMode:UILineBreakModeWordWrap];
return size;
}
-(int)textLine:(NSString *)text{
UIFont *font=[UIFont systemFontOfSize:20];
CGSize size=[text sizeWithFont:font];
CGSize allSize=[self textSize:text];
int width=size.width;
int allWidth=allSize.width;
int line=width/allWidth;
if ((line*allWidth)!=width) {
line=line+1;
}
return line;
}
15. iphone开发之用lipo合并模拟器库和真机库,发布一个通用的静态库
lipo –create Release-iphoneos/libiphone.a Debig-iphonesimulator/libiphone.a –output libiphone.a
看到这样的命令行,你会怎样理解呢。
很简单,我将模拟器和设备的静态库文件合并成一个文件输出了,以后在发布可以库的时候不用发一个模拟器版的和一个真机版的了,这样子的一个库可以在编译的时候自动识别需要连接的库。
16. iphone 优化
性能和相应速度的调优:
1. 不要阻塞主线程:将一些比较耗费时间或者可能无限等待的任务放在后台线程,一个推荐的方法就是将每个任务都封装在一个操作对象中,然后加入操作队列或者自己常见显式的线程。
2. 2. 有效的使用内存
3. 减少内存泄露:产用Instruments工具进行内存泄露的查看,
4. 使资源文件尽可能小:
5. 1. 属性列表文件也就是info.plist文件,可以通过NSPropertyListSerializtion类将属性列表文件存储为二进制格式,从而减少它们的使用空间。
6. 2. 图像产用png格式,使用pngcrush工具来进行压缩
7. 使用Core data或sqlite处理大的数据集合:
8. 延缓装载资源: 用到的时候再装载资源
9. 将程序编译为thumb格式:加入-mthumb开关可以将代码的尺寸减少最多达35%,但是,对于有大量浮点数运算的代码模块,请务必将这个选项关闭,否者将导致性能下降。
3. 恰当的分配内存
减少自动释放对象的使用:减少使用autorelease,如果必须,可以创建局部的自动释放池
为资源设置尺寸限制:
4. 减少电力消耗
1. 通过关闭未使用的硬件功能保持电能:(cpu/wifi/edge/3g/core location/加速计/磁盘)
2. 产用instruments和shark工具对应用程序进行优化,在写代码的时候应该考虑如下原则:
避免需要轮询的工作,因为轮询会阻止CPU进入休眠状态,可以通过NSRunloop或者NSTimer类来规划需要做的工作,而不是使用轮询
3. 尽一切可能使共享的UIApplication对象的idleTimerDisabled属性值保持为NO。当设备处于不活动状态一段时间后,空闲定时器会关闭设备的屏幕。如果您的应用程序不需要设备屏幕保持打开状态,就让系统将它关闭。如果关闭屏幕给您的应用程序的体验带来负面影响,则需要通过修改代码来消除那些影响,而不是不必要地关闭空闲定时器
4. 尽可能将任务合并在一起,以便使空闲时间最大化。每隔一段时间就间歇性地执行部分任务比一次性完成相同数量的所有任务开销更多的电能。间歇性地执行任务会阻止系统在更长时间内无法关闭硬件。
5. 不要使屏幕描画速度比实际需求更快。从电能消耗的角度看,描画的开销很大。不要依赖硬件来压制应用程序的帧率,而是应该根据程序实际需要的帧率来进行帧的描画。
6. 如果你通过UIAccelerometer类来接收常规的加速计事件,则当您不再需要那些事件时,要禁止这些事件。类似地,请将事件传送的频率设置为满足应用程序需要的最小值。更多信息请参见“访问加速计事件”部分。
7. 仅在需要的时候连接外部网络,不要对服务器进行轮询。
8. 当您需要连接网络时,请仅传递完成工作所需要的最少数据。请使用紧凑的数据格式,不要包含可被简单忽略的额外数据。
9. 尽可能快地以群发(in burst)方式传递数据包,而不是拉长数据传输的时间。当系统检测到设备没有活动时,就会关闭Wi-Fi和蜂窝无线信号。您的应用程序以较长时间传输数据比以较短时间传输同样数量的数据要消耗更多的电能。
10. 尽可能通过Wi-Fi无线信号连接网络。Wi-Fi耗电比基带无线少,是推荐的方式。
11. 如果您通过Core Location框架收集位置数据,则请尽可能快地禁止位置更新,以及将位置过滤器和精度水平设置为恰当的值。Core Location通过可用的GPS、蜂窝、和Wi-Fi网络来确定用户的位置。虽然Core Location已经努力使无线信号的使用最小化了,但是,设置恰当的精度和过滤器的值可以使Core Location在不需要位置服务的时候完全关闭硬件。
18.通过经纬度获取当前天气
http://www.google.com/ig/api?hl=zh-cn&weather=,,,31179238,121405225
19.NSString和NSData之间转换解决出现乱码问题
NSStringEncoding encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *receive=[[NSString alloc] initWithData:data encoding:encode];
20.控制触摸
在一定的时间内关闭事件的传递。应用程序可以调用UIApplication 的
beginIgnoringInteractionEvents 方法,并在随后调用endIgnoringInteractionEvents 方法来实现这个目的
21.cocos2d和UIViewController之间的互相切换
cocos2d切换到UIViewController:
-(void)gameOver:(UIViewController*)viewController{
[[CCDirector sharedDirector] pause];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:5];
[UIView setAnimationTransition:UIViewAnimationCurveEaseInOut
forView:[[CCDirector sharedDirector] openGLView] cache:YES];
[[[CCDirector sharedDirector] openGLView] addSubview:viewController.view];
[UIView commitAnimations];
}
UIViewController切换到cocos2d:
22.版本控制
首先在targets目标上右键点击Duplicate,这样就可以分割开两个目标,然后根据自己需要更改目标文字(主意这里也更改下plist的名字)
然后在项目上右键,点击Get Info,在Configurations中添加一个标签,这里例如为live。打开Build标签,修改其中的三项:
Product Name:修改为自己定义的名称
Info.plist File:修改为自己修改的plist文件
Preprocessor Macros:中添加标签,例如这里添加为LIVE,这样利用此标签,就可以在代码中区分不同目标
#if LIVE
#endif
23.导入ASI框架需要添加什么frameworks
包括:CoreGraphics.framework,libz.dylib,SystemConfiguration.framework,
MobileCoreServices.framework,CFNetwork.framework