標籤:
1、程式啟動後的開始動畫
程式啟動後可以載入一個簡單的動畫介面來介紹程式或者使用者資訊。
可以使用一個xib來描述介面。並且如果想在程式載入完成後第一個載入這個xib檔案,需要在Appdelegate中手動載入這個xib
// 通過stroyboard啟動,跟控制器的view並不會在程式啟動完成的時候添加到視窗,屬於懶載入範疇
// 程式啟動完成的時候調用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
// Override point for customization after application launch.
// 建立視窗
self.window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
// 載入storyboard
UIStoryboard *story = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];
UIViewController *vc = [story instantiateInitialViewController];
self.window.rootViewController = vc;
// 顯示視窗
[self.windowmakeKeyAndVisible];
// 載入歡迎介面
WelcomView *welcome = [WelcomView welcomView];
// 設定位置和尺寸
welcome.frame = self.window.bounds;
// 插入到最外層
[self.window addSubview:welcome];
returnYES;
}
在xib中如果想給內部子控制項添加動畫,並且動畫和主介面的出現有延遲,需要在以下某個方法中實現。
// 視圖添加到視窗時會調用方法didMoveToWindow 再調用didMoveToSuperview
- (void)didMoveToWindow
{
NSLog(@"%s",__func__);
}
// 視圖添加到視窗時會調用這個方法
// 將後續控制項的動畫寫道這個方法中
- (void)didMoveToSuperview
{
NSLog(@"%s",__func__);
}
回到頂部2、LaunchScreen.xib
這個系統自動產生的xib 檔案在應用啟動時會自動載入,可以在裡面添加一些控制項,但是
注意:LaunchScreen比LaunchImage優先順序高。
設定LaunchImage需要注意,預設模擬器的尺寸跟啟動圖片有關係。
// 載入類的時候調用
// 當程式一啟動的時候就會調用
+ (void)load
{
NSLog(@"%s",__func__);
}
// 當前類或者他的子類第一次使用的時候才會調用
+ (void)initialize
{
NSLog(@"%s",__func__);
}
回到頂部3、給外掛程式添加自訂的提醒方式
自訂的分類,想讓這個方法彈出載入圖片提醒
#import "UIImage+SLQImage.h"
@implementation UIImage (SLQImage)
// 按照原始圖片渲染照片,預設導航條渲染位藍色
+ (instancetype)imageWithOriImage:(NSString *)imageName
{
UIImage *image = [UIImage imageNamed:imageName];
return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
@end
把這個方法添加到外掛程式中再次編譯運行就可。
開啟外掛程式工程,找到設定檔,是一個plist檔案,然後添加需要的條目。
回到頂部4、給分類添加屬性的話,只會產生set和get方法
#import <UIKit/UIKit.h>
@interface UIView (SLQFrame)
// 分類裡面不能產生成員屬性
// 會自動產生get,set方法和成員屬性
// @property如果在分類裡面只會產生get,set方法的聲明,並不會產生成員屬性。
@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;
@end
回到頂部5、如何拋出異常
NSInteger count = items.count; // 按鈕個數
// 判斷列數是不是3的倍數,如果不是就拋出異常
if(count % 3)
{
// 跑出異常
NSException *excep = [NSException exceptionWithName:@"列數有誤" reason:@"列數不是3的倍數" userInfo:nil];
[excep raise];// 拋出異常
}
// 運行結果
// *** Terminating app due to uncaught exception ‘列數有誤‘, reason: ‘列數不是3的倍數‘
回到頂部6、自訂tabBar預設barBar顯示的圖片高度不能超過44,如果大於44顯示出問題,這是可以自訂tabBar。 6.1、建立一個類SLQTabBar,因為tabBar的個數不確定,所以需要外界傳入,這裡使用模型數組來設定。
// 模仿下UITabBar
// UITabBar裡面的按鈕由UITabBarController的子控制器
@interface SLQTabBar : UIView
// 模型數組(UITabBarItem),直接使用系統的模型即可
@property (nonatomic, strong) NSArray *items;
@end
6.2、模型數組只需在初始化時添加一次即可,所以使用懶載入方式.
@interfaceSLQTabBar ()
@property (nonatomic, weak) SLQTabBarButton *selected; // 按鈕是否選中
@end
- (void)setItems:(NSArray *)items
{
_items = items;
// UITabBarItem儲存按鈕上的圖片,按次序添加
for (UITabBarItem * bar in items) {
// 使用自訂的button,取消高亮狀態
UIButton *btn = [SLQTabBarButtonbuttonWithType:UIButtonTypeCustom];
// 設定標籤
btn.tag = self.subviews.count;
// 設定背景
[btn setBackgroundImage:bar.imageforState:UIControlStateNormal];
[btn setBackgroundImage:bar.selectedImageforState:UIControlStateSelected];
// 添加按鈕按下響應事件
[btn addTarget:selfaction:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];
[self addSubview:btn];
if (self.subviews.count == 1) {
// 預設選中第一個
[self btnClick:btn];
}
}
}
6.3、tabBar上是一排按鈕排列而成,不過沒有高亮狀態,只有Normal和selected狀態。
這個只需要重寫 UIButton 的一個方法即可。建立一個繼承自UIButton的類,重寫 setHighlighted 方法
#import "SLQTabBarButton.h"
@implementation SLQTabBarButton
// 取消按鈕高亮狀態
- (void)setHighlighted:(BOOL)highlighted
{}
@end
6. 4、每次添加過按鈕之後都要對按鈕進行布局
- (void)layoutSubviews
{
[superlayoutSubviews];
int count = (int)self.subviews.count;
// 按照螢幕寬度計算按鈕寬度
for (int i = 0 ; i < count; i ++) {
CGFloat x = 0;
CGFloat y = 0;
CGFloat w = [UIScreenmainScreen].bounds.size.width / count;
CGFloat h = self.bounds.size.height;
SLQTabBarButton *btn = self.subviews[i];
x = i * w;
btn.frame = CGRectMake(x, y, w, h);
}
}
6.5、響應按鈕點擊的話,使用代理傳遞資料
定義
@classSLQTabBar;
// 添加代理,響應按鈕點擊
@protocol SLQTabBarDelegate <NSObject>
@optional
- (void)tabBar:(SLQTabBar *)tabBar didClickButton:(NSInteger ) index;
@end
聲明
@property (nonatomic, weak) id<SLQTabBarDelegate> delegate;
使用
- (void)btnClick:(UIButton *)btn
{
// 取消選中上一個按鈕
_selected.selected = NO;
// 選中當前按鈕
btn.selected = YES;
// 記錄選中的按鈕
_selected = btn;
// 切換控制器,添加一個代理,先判斷是否有這個方法
if ([self.delegate respondsToSelector:@selector(tabBar:didClickButton:)])
{
// 發送訊息到代理,通過按鈕tag判斷是哪一個按鈕
[self.delegate tabBar:self didClickButton:btn.tag];
}
}
6.6、具體使用方法,在控制器中設定tabBar
添加自訂的tabBar到tabBar,然後將系統產生的按鈕刪除.
//添加自訂的tabBar到tabBar,然後將系統產生的按鈕刪除
- (void)setAllTabBar
{
// 移除所有子控制項
// [self.tabBar removeFromSuperview];
// 添加自訂tabBar
SLQTabBar *bar = [[SLQTabBar alloc] init];
// 傳入模型資料
bar.items = self.items;
// 設定尺寸
bar.frame = self.tabBar.bounds;
// 設定代理,監聽按鈕點擊
bar.delegate = self;
// 添加到tabBar,但是要把系統內建的按鈕刪除
[self.tabBar addSubview:bar];
}
移除系統按鈕
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// 刪除系統內建的tabBar
for (UIView *childView in self.tabBar.subviews) {
if (![childView isKindOfClass:[SLQTabBar class]]) {
[childView removeFromSuperview];
}
}
}
監聽按鈕點擊
- (void)tabBar:(SLQTabBar *)tabBar didClickButton:(NSInteger)index
{
// NSLog(@"%s--%d",__func__,index);
// 切換控制器
self.selectedIndex = index;
}
回到頂部7、手動添加pch檔案都項目
pch檔案中包含的東西在項目中每個檔案中都可以使用。
回到頂部8、load和initialize
// 當程式一啟動的時候就會調用
+ (void)load
{
}
// 當前類或者他的子類第一次使用的時候才會調用
+ (void)initialize
{}
回到頂部9、 給任意彈出的視窗添加遮蓋
這個也比較常見,比如說彈出登陸介面時,程式其他部分都是灰色背景,且不能點擊。
可以給程式添加一個灰色的View,而且要顯示在所有介面之前,那麼可以使用
[UIApplication sharedApplication].keyWindow;
添加到這個視窗上的視窗預設都在最前面。
自訂一個繼承自UIView的類,添加兩個方法即可。
// 螢幕尺寸
#define SLQScreenBounds [UIScreen mainScreen].bounds
// 主視窗
#define SLQKeyWindow [UIApplication sharedApplication].keyWindow
// 顯示遮蓋
+ (void)show
{
// 擷取主視窗,添加一個view 到主視窗
UIView *view = [[SLQCoverView alloc] initWithFrame:SLQScreenBounds];
view.backgroundColor = [UIColorblackColor];
view.alpha = 0.4;
// 添加視窗到主視窗,顯示在最上層
[SLQKeyWindow addSubview:view];
}
// 隱藏遮蓋
+ (void)hide
{
// 取出子視窗移除,首先判斷是不是SLQCoverView類型的view
for (UIView *childView in SLQKeyWindow.subviews) {
if ([childView isKindOfClass:self]) {
[childView removeFromSuperview];
}
}
}
回到頂部10、loadView、viewDidLoad和viewDidUnLoad
loadView 蘋果設計這個方法就是給我們自訂UIViewController的view用的
viewDidLoad 在建立過控制器的view後,向view中添加其他控制項
viewDidUnLoad 系統發出記憶體警告時
關係
1.第一次訪問UIViewController的view時,view為nil,然後就會調用loadView方法建立view
2.view建立完畢後會調用viewDidLoad方法進行介面元素的初始化
3.當記憶體警告時,系統可能會釋放UIViewController的view,將view賦值為nil,並且調用viewDidUnload方法
4.當再次訪問UIViewController的view時,view已經在3中被賦值為nil,所以又會調用loadView方法重新建立view
5.view被重新建立完畢後,還是會調用viewDidLoad方法進行介面元素的初始化
11、UINavigationBar 所產生的圖片都是經過處理的view,為藍色
原始圖片
// 預設左右兩遍的view都是藍色的,所以要返回一個原始的圖片
UIImage *image = [UIImageimageNamed:@"CS50_activity_image"] ;
// 設定圖片的渲染方式為原始圖片
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:imagestyle:UIBarButtonItemStylePlain target:self action:@selector(activeBtnClick)];
IOS-UI總結