1. 如何實現動畫?
Xcode的設計是圖形的更動都得等最外層函式執行完畢後才會真正被設定,例如你在ViewDidLoad()底下寫個for迴圈將某個矩形圖片長寬持續增加10次、次與次中間再增加100ms的延遲,你預期看到程式執行有個圖片放大的動畫,結果你看到圖片維持一開始的大小動也不動,然後安靜一秒後忽然看到已經長到最大的圖片。所以得要找個能離開函式執行圖片物件更動但又可以回到函式繼續相同動畫的程式碼。方法是你得在觸發動畫的函式下呼叫下列函式:
[NSTimer scheduledTimerWithTimeInterval:.025 target:self selector:@selector(oddForwardAnimation) userInfo:nil repeats:NO];
這函式的意思是間隔多久後自動呼叫某個函式。.025是秒數,等於25ms,開發者可以自行設定動畫的間隔(根據人眼的辨識能力每個動作的間隔建議不要大於0.05秒),oddForwardAnimation就是動畫實現的函式,函式名稱當然是由開發者自行設定。但重點是這個實現動畫的函式底下還得再次呼叫上面那個函式,這樣才能叫做動畫。
2. 如何更改字體大小?
動畫如果牽扯到文字的放大,那就會用到字體大小設定。這時可以用到此函式:
[diceNumberLabel setFont:[UIFont systemFontOfSize:20]];
因為不是每種元件都有支持setFont,所以這邊只以UILabel當範例。
3. 如何讓指定物件挪到最上層?
在動畫處理上常常需要用到將圖片動態移動到最上層的功能,當然圖片可以打從一開始就位在最上層,只是藉由hidden參數隱藏起來。但萬一需要營造交替的感覺,則物件移動到最上層的功能就變為必要學會的。例如兩張書頁A和B,把A頁翻離開畫面邊界之後看到B頁,接著立刻要把A頁移到B頁後面,才能繼續翻頁看到B頁的下一頁(感覺書本好像很多頁,實際上兩頁就夠了)。呼叫下列函式就能輕鬆做到:
[self.view bringSubviewToFront:(UIImageView *)圖片物件名稱];
4. 如何同時支援3.5吋和4吋iPhone?
iPhone 3和iPhone 4是3.5吋螢幕,使用的解析度為480x640,然而iPhone 5是4吋640x1136。iOS 6之後的Xcode可以支援自動放大的功能,但這只限於使用Storyboard所擺放的元件。假如你的按鈕是藏在圖片後面,圖片會被放大,但按鈕卻是一樣的大小;一樣的起始位置。於是得額外根據現在系統所使用的解析度來決定各物件的大小和起始位置。這時可以使用下列程式碼判斷現在系統所用的螢幕大小,進而調整物件設定。
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if (screenBounds.size.height == 568) { //4-inch
}
else { //3.5-inch
}
5. 如何連結到App Store的"撰寫評論"?
Xcode有現成的函式可以呼叫,只要把ID改成自己App申請的ID即可。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:
@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?
type=Purple+Software&id=635903400"]];
type=Purple+Software&id=635903400"]];
在填表申請完畢後,上傳程式碼與binary前,會得到此App的ID,這時只要置換自己的ID,待程式上架,就可以順利連結自己App專屬的"撰寫評論"。若要其他連結,可以參考http://bjango.com/articles/ituneslinks/。
6. 如何將程式動作加入某個轉場過程?
如下圖,假設你有三個按鈕,觸發後分別轉場至三個不同的View,可是你又有些參數是在按鈕按下的時候才去設定。這時候你可能直覺是實現一個IBAction函式並連結到按鈕的Sent Events,也就是說這個按鈕同時擁有Modal型別Segue的Action以及Sent Events的Touch Down Event。可是當你實作時會發現,按鈕按下去,轉場換頁卻不會執行Touch Down對應的函式。
這時必須借用另外一個隱藏的函式,也就是xcode預設的函式,無須宣告,只要去實作其內容即可。這函式實作方法為:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ShowUnfinishedGame"]) {
//參數設定或操作的實現
}
}
只要是這個View Controller下有任何轉場行為,都會進入此函式,所以需要辨識是哪個Segue,因此需要幫不同轉場Segue取名字。取名字的方法如下圖,點選轉場的Segue之後,在參數設定裡的Identifier欄位填上ID。如此一來,當這個轉場執行時,除了有轉場動畫外,還可以執行你要的操作。
7. 如何不透過Navigator以及Segue回到上一頁?
我在初學者筆記(二)有提到如何使用Navigator實現可返回上一頁的按鈕。另一種直覺的方式就是把返回按鈕透過Segue拉藍線回上一個View,但這麼做會有些問題。如果上一頁擁有Tab Bar,透過此方式回到上一頁時會發現下面的Tab不見了。想要保留Tab,就得把Segue藍線連到管理所有Tab的Tab Bar Controller(如下圖)。可是這就會限制僅能返回Tab Bar的首頁。
第三種方式是以圖層的概念,也就是把當下的View移除,進而呈現推疊在下方的頁面,這動作等同於回到上一頁。
-(IBAction)clickReturn:(id)sender
{
[self dismissViewControllerAnimated:YES completion:^{/*可以在這裡加額外的動作,不然空著也行*/}];
}
沒有留言:
張貼留言