今年暑假,自己獨立完成了一個簡單的iOS的APP,是一個bbs的客戶端,叫做喻信星空。現在正在測試,准備將其上架app store。
對於iOS的應用,有一個特點就是必須要有一張LaunchImage,在工程的設置裡可以進行設置,LaunchImage可以有兩種選擇一個是自己提供圖片,另一個是LaunchScreen.storyboard。
如果LaunchImage缺失,在iPhone5以後的設備上會出現無法全屏的問題,在應用的上方和下方會有兩條黑條,如下方圖片。
而且編譯時會出現警告:Missing "[email protected]" launch image,當你點擊這個警告時,Xcode會提示你是否添加一張啟動圖片,如果你選擇添加,Xcode則會幫你添加一張全黑的640?×?1136的啟動圖片,而此時再次編譯運行,你會發現應用剛啟動時是黑屏,進入應用後不能全屏的問題消失了。
當然你可以用自己的啟動圖片來替換這張啟動圖,或者是使用stZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcnlib2FyZKOstvjU2s7Sv7TAtMq508NzdG9yeWJvYXJk06a4w7vhuPy6w6Osc3Rvcnlib2FyZLK7vfbS19PaysrF5LK7zazJ6LG4o6zSssrHxru5+8v5zca89rXEoaM8L2NvZGU+PC9wPg0KPGgzIGlkPQ=="啟動動畫">
啟動動畫
現在的應用大多都有啟動動畫,當然我也想加在這個客戶端中,而iOS的APP又必須要有LaunchImage,那為何不將LaunchImage和啟動動畫結合在一起,想到這裡我十分激動,這樣的結合感覺十分完美。
於是到網上搜索了一番,發現了將這二者結合起來的方法:
UIViewController *viewController = [[UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil] instantiateViewControllerWithIdentifier:@"LaunchScreen"];
通過此法,便能得到LaunchScreen的VC,如此問題便簡單多了,通過這個VC獲取VC的view,用這個view便可以制作動畫了,如下圖。
登錄界面
登錄界面看似簡單,但也是有玄機在這其中,比如鍵盤的適配,當點擊輸入框,鍵盤便會彈出,此時就有可能遮擋住登錄按鍵或是其他輸入框,這個問題該如何解決呢,其實不難,iOS中在鍵盤狀態改變時會發送全局通知,只要注冊觀察者接收這些通知即可,需要注意的是注冊的通知最好是WillShow和WillHiden,這樣會顯得自然些,不然會有比較嚴重的延遲:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden)
name:UIKeyboardWillHideNotification
object:nil];
然後在這下面兩個方法裡處理鍵盤彈起和收回的情況,在
- (void)keyboardWasShown:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.f, 0.f, kbSize.height, 0.f);
self.backgroundView.contentInset = contentInsets;
self.backgroundView.scrollIndicatorInsets = contentInsets;
CGRect rect = self.loginButton.frame;
rect.size.height += rect.size.height;
[self.backgroundView scrollRectToVisible:rect animated:YES];
}
- (void)keyboardWillBeHidden {
self.backgroundView.contentInset = UIEdgeInsetsZero;
self.backgroundView.scrollIndicatorInsets = UIEdgeInsetsZero;
}
系統發送的通知中,包含了鍵盤高度的信息,拿到這個高度後,便可以將登錄的界面向上移動。
這裡我的登錄界面是放在一個UIScrollView之上,其實和微信的登錄界面有些相似,可以隨著你的手指上下滾動,我很同意我一個同事的說法,他說每個界面都應該是一個ScrollView,都應該能夠響應用戶是手勢,就是用戶在滑動或是拖動的時候,都應該去響應,我覺得這會讓用戶覺得很爽,會讓人覺得比較靈動。
封裝簡單的tabbar
由TabBar和幾個VC作為主界面的應用很是常見,當然系統提供了UITabBarController和UITabBar,不過如果想要定制想要的樣式的tabbar,用系統的似乎就有些困難了,像tabbar這樣並不復雜的控件,自己寫一個是很方便的,我想要一個只有圖片沒有文字的tabbar,於是就自己寫了一個DPTabBar。
首先封裝一個DPTabBarItem,繼承自UIButton,其實想來也簡單,tabbar中不同的tab其實就是幾個button,此處使用button作為cell十分合適,而且button具有選中和不選中的屬性,而且可以為兩種狀態設置不同的圖片,在此處十分適合。
@interface DPTabBarItem : UIButton
- (instancetype)initWithImage:(UIImage *)image selectedImage:(UIImage *)selectedImage;
@end
隨後便是封裝TabBar了
@class DPTabBarItem;
@protocol DPTabBarDelegate;
@interface DPTabBar : UIView
@property (nonatomic, readwrite, weak) id
初始化方法只有一個,便是使用DPTabBarItem進行初始化,如果不設置最開始的selectedIndex,則默認為0,此外還有兩個屬性一個表示被選中的tab,另一個是代理,該代理定義如下:
@protocol DPTabBarDelegate
當選中的Tab變化時,調用此代理方法,代理根據index來調整顯示的頁面。