寫Log
在Xcode裏,點菜單Run > Console 就能夠看到NSLog的記錄.
NSLog(@"log: %@ ", myString);
NSLog(@"log: %f ", myFloat);
NSLog(@"log: %i ", myInt);
圖片顯示
不須要UI資源綁定,在屏幕任意處顯示圖片。 下面的代碼能夠被用到任意 View 裏面。
CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 109.0f);
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage p_w_picpathNamed:@"myImage.png"]];
myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myImage];
[myImage release];
應用程序邊框大小
咱們應該使用"bounds"來得到應用程序邊框,而不是用"applicationFrame"。"applicationFrame"還包含了一個20像素的status bar。除非咱們須要那額外的20像素的status bar。
Web view
UIWebView類的調用.
CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];
[webView setBackgroundColor:[UIColor whiteColor]];
NSString *urlAddress = @"http://www.google.com";
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
[self addSubview:webView];
[webView release];
顯示網絡激活狀態圖標
在iPhone的狀態欄的左上方顯示的一個icon假如在旋轉的話,那就說明如今網絡正在被使用。
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; // to stop it, set this to NO
Animation: 一組圖片
連續的顯示一組圖片
NSArray *myImages = [NSArray arrayWithObjects:
[UIImage p_w_picpathNamed:@"myImage1.png"],
[UIImage p_w_picpathNamed:@"myImage2.png"],
[UIImage p_w_picpathNamed:@"myImage3.png"],
[UIImage p_w_picpathNamed:@"myImage4.gif"],
nil];
UIImageView *myAnimatedView = [UIImageView alloc];
[myAnimatedView initWithFrame:[self bounds]];
myAnimatedView.animationImages = myImages;
myAnimatedView.animationDuration = 0.25; // seconds
myAnimatedView.animationRepeatCount = 0; // 0 = loops forever
[myAnimatedView startAnimating];
[self addSubview:myAnimatedView];
[myAnimatedView release];
Animation: 移動一個對象
讓一個對象在屏幕上顯示成一個移動軌跡。注意:這個Animation叫"fire and forget"。也就是說編程人員不可以在animation過程當中得到任何信息(好比當前的位置)。假如你須要這個信息的話,那麼就須要經過animate和定時器在必要的時候去調整x&y座標。
CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
theAnimation.duration=1;
theAnimation.repeatCount=2;
theAnimation.autoreverses=YES;
theAnimation.fromValue=[NSNumber numberWithFloat:0];
theAnimation.toValue=[NSNumber numberWithFloat:-60];
[view.layer addAnimation:theAnimation forKey:@"animateLayer"];
NSString和int類型轉換
下面的這個例子讓一個text label顯示的一個整型的值。
currentScoreLabel.text = [NSString stringWithFormat:@"%d", currentScore];
正澤表達式 (RegEx)
當前的framework還不支持RegEx。開發人員還不能在iPhone上使用包括NSPredicate在類的regex。可是在模擬器上是可使用NSPredicate的,就是不能在真機上支持。
能夠拖動的對象items
下面展現如何簡單的建立一個能夠拖動的p_w_picpath對象:
1. 建立一個新的類來繼承UIImageView。
@interface myDraggableImage : UIImageView {
}
2. 在新的類實現的時候添加兩個方法:
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
// Retrieve the touch point
CGPoint pt = [[touches anyObject] locationInView:self];
startLocation = pt;
[[self superview] bringSubviewToFront:self];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
// Move relative to the original touch point
CGPoint pt = [[touches anyObject] locationInView:self];
CGRect frame = [self frame];
frame.origin.x += pt.x – startLocation.x;
frame.origin.y += pt.y – startLocation.y;
[self setFrame:frame];
}
3. 如今再建立一個新的p_w_picpath加到咱們剛建立的UIImageView裏面,就能夠展現了。
dragger = [[myDraggableImage alloc] initWithFrame:myDragRect];
[dragger setImage:[UIImage p_w_picpathNamed:@"myImage.png"]];
[dragger setUserInteractionEnabled:YES];
震動和聲音播放
下面介紹的就是如何讓
手機
震動(注意:在simulator裏面不支持震動,可是他能夠在真機上支持。)
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Sound will work in the Simulator, however some sound (such as looped) has been reported as not working in Simulator or even altogether depending on the audio format. Note there are specific filetypes that must be used (.wav in this example).
SystemSoundID pmph;
id sndpath = [[NSBundle mainBundle]
pathForResource:@"mySound"
ofType:@"wav"
inDirectory:@"/"];
CFURLRef baseURL = (CFURLRef) [[NSURL alloc] initFileURLWithPath:sndpath];
AudioServicesCreateSystemSoundID (baseURL, &pmph);
AudioServicesPlaySystemSound(pmph);
[baseURL release];
線程
1. 建立一個新的線程:
[NSThread detachNewThreadSelector:@selector(myMethod)
toTarget:self
withObject:nil];
2. 建立線程所調用的方法:
- (void)myMethod {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
*** code that should be run in the new thread goes here ***
[pool release];
}
假如咱們須要在線程裏面調用主線程的方法函數,就能夠用performSelectorOnMainThread來實現:
[self performSelectorOnMainThread:@selector(myMethod)
withObject:nil
waitUntilDone:false];
讀取crash的日記文件
假如很不幸,咱們的某處代碼引發了crash,那麼就能夠閱讀這篇文章應該會有用: navigate here
如何進行測試
1. 在模擬器裏,點擊 Hardware > Simulate Memory Warning to test. 那麼咱們整個程序每一個頁面就都可以支持這個功能了。
2. Be sure to test your app in Airplane Mode.
Access properties/methods in other classes
One way to do this is via the AppDelegate:
myAppDelegate *appDelegate = (myAppDelegate *)[[UIApplication sharedApplication] delegate]; [[[appDelegate rootViewController] flipsideViewController] myMethod];
建立隨機數
調用arc4random()來建立隨機數. 還能夠經過random()來建立, 可是必需要手動的設置seed跟系統時鐘綁定。這樣纔可以確保每次獲得的值不同。因此相比較而言arc4random()更好一點。
定時器
下面的這個定時器會每分鐘調用一次調用myMethod。
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(myMethod)
userInfo:nil
repeats:YES];
當咱們須要給定時器的處理函數myMethod傳參數的時候怎麼辦?用"userInfo"屬性。
1. 首先建立一個定時器:
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(myMethod)
userInfo:myObject
repeats:YES];
2. 而後傳遞NSTimer對象處處理函數:
-(void)myMethod:(NSTimer*)timer {
// Now I can access all the properties and methods of myObject
[[timer userInfo] myObjectMethod];
}
用"invalidate"來中止定時器:
[myTimer invalidate];
myTimer = nil; // ensures we never invalidate an already invalid Timer
應用分析
當應用程序發佈版本的時候,咱們可能會須要收集一些數據,好比說程序被使用的頻率如何。這個時候大多數的人使用PinchMedia來實現。他們會提供咱們能夠很方便的加到程序裏面的Obj-C代碼,而後就能夠經過他們的網站來查看統計數據。
Time
Calculate the passage of time by using CFAbsoluteTimeGetCurrent().
CFAbsoluteTime myCurrentTime = CFAbsoluteTimeGetCurrent(); // perform calculations here
警告窗口
顯示一個簡單的帶OK按鈕的警告窗口。
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"An Alert!"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
Plist文件
應用程序特定的plist文件能夠被保存到app bundle的Resources文件夾。當應用程序運行起來的時候,就會去檢查是否是有一個plist文件在用戶的Documents文件夾下。假如沒有的話,就會從app bundle目錄下拷貝過來。
// Look in Documents for an existing plist file
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
myPlistPath = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithFormat: @"%@.plist", plistName] ];
[myPlistPath retain];
// If it’s not there, copy it from the bundle
NSFileManager *fileManger = [NSFileManager defaultManager];
if ( ![fileManger fileExistsAtPath:myPlistPath] ) {
NSString *pathToSettingsInBundle = [[NSBundle mainBundle]
pathForResource:plistName ofType:@"plist"];
}
如今咱們就能夠從Documents文件夾去讀plist文件了。
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *path = [documentsDirectoryPath
stringByAppendingPathComponent:@"myApp.plist"];
NSMutableDictionary *plist = [NSDictionary dictionaryWithContentsOfFile: path];
Now read and set key/values
myKey = (int)[[plist valueForKey:@"myKey"] intValue];
myKey2 = (bool)[[plist valueForKey:@"myKey2"] boolValue];
[plist setValue:myKey forKey:@"myKey"];
[plist writeToFile:path atomically:YES];
Info button
爲了更方便End-User去按,咱們能夠增大Info button上能夠觸摸的區域。
CGRect newInfoButtonRect = CGRectMake(infoButton.frame.origin.x-25,
infoButton.frame.origin.y-25, infoButton.frame.size.width+50,
infoButton.frame.size.height+50);
[infoButton setFrame:newInfoButtonRect];
查找Subviews(Detecting Subviews)
咱們能夠經過循環來查找一個已經存在的View。當咱們使用view的tag屬性的話,就很方便實現Detect Subviews。
for (UIImageView *anImage in [self.view subviews]) {
if (anImage.tag == 1) {
// do something
}
}
手冊文檔