IOS7裏launchimage必須有568的圖片
// ios6顯示狀態欄
在單例裏,appdelegate.m裏:application.statusBarHidden = NO;
去除玻璃渲染:
修改狀態欄的顏色:在控制器裏viewcontroller.m中:
-(UIStatusBarStyle)preferreStatusBarStyle
{
return UIStatusBarStyleLightContent; //白色
}
給界面設灰色:
狀態欄一般交給application管理:
在info裏添加屬性
則不交給控制器管理上面所做無效,交給了application管理
// 設置狀態欄的顏色
application.statusBarStyle = UIStatusBarStyleLightContent;
建Classes文件夾,是虛擬的文件夾,在Finder建。appdelegate.m放倒Other文件夾裏。
修改索引的位置,build setting搜索pch,顯示簡介拷貝路徑。
導航控制器導航標題一樣,tabbar標題不一樣。每個界面是一個tabbar,導航控制器是它的子控制器:
把storyboard的view刪掉,拖一個tab bar controller刪掉view controller,再拖navigation controller.右鍵view controller連接到navigation controller
把table view controller刪掉改爲view controller,navigation controller的root view controller連接它們
選中tab bar controller底部tab bar item 設置image屬性爲相應圖片,系統自帶的tab bar 顯示不了這個圖片,圖片填充整個tab bar item。自定義tab bar controller。
新建類ILTabBarViewController繼承至UITabBarController放在main文件夾裏;新建tab bar,ILTabBar 繼承UIView放在main文件夾裏。
選中tab bar controller ,告訴系統該tab bar controller採取自定義的方式
在ILTabBarViewController.m裏
@interface ILTabBar()
@property (nonatomic, weak) UIButton *selectedButton;//默認uiview用weak
@end
- (void)viewDidLoad
{
[super viewDidLoad];
// 移除自帶的tabBar,removeFromSuperview不會馬上銷燬,等該函數結束後才銷燬,所以下面能tabBar.frame = self.tabBar.frame;
[self.tabBar removeFromSuperview];
NSLog(@"%@",self.tabBar);
// 創建tabBar
ILTabBar *tabBar = [[ILTabBar alloc] init];
tabBar.delegate = self;
tabBar.frame = self.tabBar.frame;
[self.view addSubview:tabBar];
}
在ILTabBar.m裏
- (void)addBtns
{
NSString *imageName = nil;
NSString *selImageName = nil;
for (int i = 0; i < 5; i++) {
ILTabBarButton *btn = [ILTabBarButton buttonWithType:UIButtonTypeCustom];
// 綁定角標
btn.tag = i;
imageName = [NSString stringWithFormat:@"TabBar%d",i + 1];
selImageName = [NSString stringWithFormat:@"TabBar%dSel",i + 1];
// 設置按鈕的圖片
[btn setBackgroundImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:selImageName] forState:UIControlStateSelected];
// 監聽按鈕的點擊
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown]; //點擊立即 upinside還等放開
[self addSubview:btn];
// 默認選中第一個按鈕
if (i == 0) {
[self btnClick:btn];
}
}
}
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat btnW = self.bounds.size.width / self.subviews.count;
CGFloat btnH = self.bounds.size.height;
CGFloat btnX = 0;
CGFloat btnY = 0;
// 設置按鈕的尺寸
for (int i = 0; i < self.subviews.count; i++) {
UIButton *btn = self.subviews[i];
btnX = i * btnW;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
}
}
// 點擊按鈕的時候調用
- (void)btnClick:(UIButton *)button
{
// 取消之前選擇按鈕
_selectedButton.selected = NO;
// 選中當前按鈕
button.selected = YES;
// 記錄當前選中按鈕
_selectedButton = button;
// 切換控制器,通知ILTabBarViewController修改SelectedIndex
if ([_delegate respondsToSelector:@selector(tabBar:didSelectedIndex:)]) {
[_delegate tabBar:self didSelectedIndex:button.tag];
}
}
取消高亮效果 自定義button,新建ILTabBarButton繼承uibutton放在main文件夾裏
在ILTabBarButton.m裏:
// 取消高亮狀態
- (void)setHighlighted:(BOOL)highlighted
{
}
切換控制器:
1.用block
在ILTabBar.h裏:
// block作用:保存一段代碼,到恰當的時候再去調用
// 如果需要傳參數給其他對象,block才需要定義參數
typedef void(^ILTabBarBlock)(int selectedIndex);
@interface ILTabBar : UIView
//// 相當於小弟,定義block arc用copy
@property (nonatomic, copy) ILTabBarBlock block;
@end
在ILTabBarViewController.m裏:
tabBar.block = ^(int selectedIndex){
self.selectedindex = selectedIndex;
}
在ILTabBar.m裏:
btnClick裏:
if (_block) { //防止默認選中0時,block 爲nil導致運行報錯
_block(button.tag);
}
2.用代理
在ILTabBar.h裏:
@class ILTabBar;
@protocol ILTabBarDelegate <NSObject>
@optional
- (void)tabBar:(ILTabBar *)tabBar didSelectedIndex:(int)index;
@end
@interface ILTabBar : UIView
@property (nonatomic, weak) id<ILTabBarDelegate> delegate; //是weak
@end
在ILTabBarViewController.m裏:
@interface ILTabBarViewController ()<ILTabBarDelegate>
@end
viewDidLoad裏:tabBar.delegate = self;
// 代理方法
- (void)tabBar:(ILTabBar *)tabBar didSelectedIndex:(int)index
{
self.selectedIndex = index;
}
在ILTabBar.m裏:
btnClick裏:
// 切換控制器
if ([_delegate respondsToSelector:@selector(tabBar:didSelectedIndex:)]) {
[_delegate tabBar:self didSelectedIndex:button.tag];
}
完善tarbar:
在ILTabBarViewController.m裏:
NSString *imageName = nil;
NSString *selImageName = nil;
for (int i = 0; i < self.childViewControllers.count; i++) {
imageName = [NSString stringWithFormat:@"TabBar%d",i + 1];
selImageName = [NSString stringWithFormat:@"TabBar%dSel",i + 1];
// 添加底部按鈕
[tabBar addTabBarButtonWithName:imageName selName:selImageName];
}
在ILTabBar.h裏:
// 給外界創建按鈕
- (void)addTabBarButtonWithName:(NSString *)name selName:(NSString *)selName;
在ILTabBar.m裏:
// 提供一個方法給外界添加按鈕
- (void)addTabBarButtonWithName:(NSString *)name selName:(NSString *)selName
{
// 創建按鈕
ILTabBarButton *btn = [ILTabBarButton buttonWithType:UIButtonTypeCustom];
// 設置按鈕的圖片
[btn setBackgroundImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:selName] forState:UIControlStateSelected];
// 監聽按鈕的點擊
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];
[self addSubview:btn];
}
把
btn.tag = i;
if (i == 0) {
[self btnClick:btn];
}
放在layoutSubviews裏
ps:
layoutSubviews在以下情況下會被調用:
1、init初始化不會觸發layoutSubviews
2、addSubview會觸發layoutSubviews,等addSubview所在函數結束後
3、設置view的Frame會觸發layoutSubviews,當然前提是frame的值設置前後發生了變化
4、滾動一個UIScrollView會觸發layoutSubviews
5、旋轉Screen會觸發父UIView上的layoutSubviews事件
6、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件