重點(diǎn) (一) : IPad和IPhone

1.png
2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

iPad開(kāi)發(fā)與iPhone開(kāi)發(fā)的異同
簡(jiǎn)介
1. iPad開(kāi)發(fā)與iPhone開(kāi)發(fā)的異同
2. QQ空間的分析
3. 登錄界面的搭建
4. Dock的初始化
5. Dock中BottomMenu的初始化
6. 添加IconButton和添加BottomMenu的子控件
7. 添加Tabbar的子控件
8. IconButton內(nèi)容設(shè)置和BottomMenu子控件點(diǎn)擊
9. tabbar點(diǎn)擊和全部動(dòng)態(tài)的UISegmentControl
Published using GitBook
My Book

一蹬敲、iPad與iPhone搭載的系統(tǒng)
兩者都是搭載的ios系統(tǒng)

二鳞上、屏幕的尺寸與分辨率不同

1.iPhone與iPad有不同的英寸奠滑,像素和點(diǎn),開(kāi)發(fā)一般只關(guān)心點(diǎn)坐標(biāo)系
2.iPhone有3.5inch党窜,4.0inch,4.7inch,5.5inch 荞胡,分別對(duì)應(yīng)的點(diǎn)坐標(biāo)系為:
320x480,320x568,375x667,414x736
3.iPad的有9.7inch和7.9inch了嚎,對(duì)應(yīng)的點(diǎn)坐標(biāo)系都為768x1024

三泪漂、UI元素的排布和設(shè)計(jì)不同

1.一般情況下iPhone應(yīng)用要求只支持豎屏,iPhone游戲要求只支持橫屏
iPad應(yīng)用一般情況下要求既要支持橫屏歪泳,也要支持豎屏
2.iPad屏幕更大萝勤,他可以容納更多的UI元素,因此排列方式與iPhone不同

四呐伞、iphone鍵盤(pán)與iPad鍵盤(pán)不同

iPad鍵盤(pán)相對(duì)于iPhone鍵盤(pán)多了一個(gè)退出按鈕敌卓,用來(lái)退出鍵盤(pán)

五、在API上的不同
  1. iPad有屬于自己特有的API伶氢,只能用在iPad開(kāi)發(fā)上
    分別為:
    UIPopVerController
    UISplitViewController

  2. iPhone上的API在iPad上都可以用

  3. iPhone上與iPad的共有的API在顯示效果上有差異
    比如:
    iPhone的UIActionSheet,會(huì)從底部彈出來(lái)進(jìn)行選擇趟径,并默認(rèn)帶取消按鈕
    如果相同的代碼運(yùn)行在iPad上會(huì)從中間彈出尊流,并沒(méi)有取消按鈕

    六棘伴、屏幕方向的支持不同
    1.iPhone上面支持3個(gè)方向歇式,不支持HOME鍵朝上方向
    2.iPad上面支持4個(gè)方向

    七奏赘、開(kāi)發(fā)上面的細(xì)節(jié)不同
    1.僅僅開(kāi)發(fā)iPad項(xiàng)目,在創(chuàng)建項(xiàng)目的時(shí)候選擇iPad
    2.如果是需要iPhone與iPad的一起開(kāi)發(fā)的時(shí)候選擇universal
    3.僅僅開(kāi)發(fā)iPhone項(xiàng)目幕屹,在創(chuàng)建項(xiàng)目的時(shí)候選擇iPhone

    八扇救、設(shè)備支持應(yīng)用程序的不同
    1.iPhone上面只能運(yùn)行iPhone應(yīng)用程序
    2.iPad上面既可以運(yùn)行iPad程序,也可以運(yùn)行iPhone程序
    如果在iPad運(yùn)行iPhone程序會(huì)把程序等比例拉伸香嗓,之后顯示在iPad上
    九迅腔、iPhone開(kāi)發(fā)與iPad開(kāi)發(fā)的流程
    開(kāi)發(fā)流程都是一致的

QQ空間的分析
一. 登陸界面
1.登陸界面使用AutoLayout搭建,并適配橫豎屏
2.狀態(tài)欄文字顏色為白色
3.當(dāng)帳號(hào)和密碼都為123時(shí)可以登陸成功
4.帳號(hào)或密碼為空提示登陸失敗,并給予抖動(dòng)效果
5.帳號(hào)或密碼錯(cuò)誤提示登陸失敗,并給予抖動(dòng)效果
6.帳號(hào)與密碼輸入框:
1.帳號(hào)輸入框?yàn)槊魑娘@示
2.密碼輸入框?yàn)榘滴娘@示
3.帳號(hào)輸入框return按鈕為next
4.密碼輸入框return按鈕為done
5.當(dāng)輸入框中有內(nèi)容時(shí),return按鈕才可以點(diǎn)擊
6.當(dāng)點(diǎn)擊next按鈕時(shí),切換密碼輸入框?yàn)榈谝豁憫?yīng)者
7.當(dāng)點(diǎn)擊done按鈕時(shí),開(kāi)始登陸
8.取消聯(lián)想輸入
9.當(dāng)輸入框中有內(nèi)容時(shí),顯示刪除按鈕
10.當(dāng)切換到輸入框時(shí),自動(dòng)情況輸入框內(nèi)容
7.記住密碼與自動(dòng)登陸邏輯
1.當(dāng)點(diǎn)擊記住密碼時(shí),記住密碼如果不被選中,自動(dòng)登陸也不被選中
2.當(dāng)點(diǎn)擊自動(dòng)登陸時(shí),自動(dòng)登陸被選中,記住密碼也被選中

二. 詳情界面
? 1.橫屏與豎屏狀態(tài)下,右邊內(nèi)容的寬度相等,高度為控制器的高度
? 2.橫屏狀態(tài)下,左邊工具欄的寬度大于豎屏狀態(tài)下左邊工具欄的寬度
? 3.橫豎屏切換時(shí),左邊工具欄的高度與寬度也跟著切換
4.工具欄被分為上.中.下三大塊
1.最上為頭像:當(dāng)點(diǎn)擊時(shí),會(huì)切換右邊控制器的內(nèi)容,在橫屏?xí)r,顯示文字和圖片,豎屏?xí)r僅顯示圖片
2.中間類(lèi)似tabbar:一個(gè)被選中,另一個(gè)就會(huì)被反選中,會(huì)切換右邊的控制器的內(nèi)容,在橫屏?xí)r顯示文字和圖標(biāo),豎屏?xí)r僅顯示文字
3.底部菜單:當(dāng)點(diǎn)擊某個(gè)會(huì)在控制器的部分控件彈出一個(gè)控制器,橫屏的時(shí)候三個(gè)控件橫著排列,豎屏?xí)r,三個(gè)控件豎著

登錄界面的搭建
? 一.創(chuàng)建項(xiàng)目并導(dǎo)入資源文件

? 二.分文件夾

三.使用Autolayout搭建登陸界面

1.拖入U(xiǎn)IImageView,距離控制器的View的頂部為40,并水平居中顯示,寬高為圖片自身size
2.登陸界面底層交予一個(gè)UIView管理(方便做抖動(dòng)動(dòng)畫(huà)),方便顯示設(shè)置背景顏色,并設(shè)置寬高為300x300,距離圖片為2.0,并兩者中心點(diǎn)對(duì)其
3.拖入輸入框背景圖片致View中,并對(duì)圖片進(jìn)行拉伸,高度為圖片高度,寬度為父控件寬度,頂部為0
4.添加兩個(gè)UILabel到輸入框圖片中,文字顏色為白色,上面為帳號(hào),下面為密碼,寬度為100,高度為45,兩個(gè)UILabel相隔12,并添加約束
5.添加帳號(hào)輸入框與密碼輸入框,改變輸入框的style,設(shè)置位子均為123,顏色為白色,并相對(duì)于UILabel添加約束
6.添加登陸按鈕,改變按鈕類(lèi)型為custom(否則不能顯示高亮圖片),設(shè)置普通與高亮背景圖片,設(shè)置文字為登陸,顏色為白色,寬度為父控件寬度,高度為圖片高度,距離上面的控件為10,并添加約束
7.添加兩個(gè)按鈕,分別占據(jù)父控件的一半,設(shè)置文字左邊為記住密碼,右邊為自動(dòng)登陸,文字大小為14,設(shè)置普通圖片與選擇圖片,并添加約束

四.細(xì)節(jié)處理

1.調(diào)節(jié)登陸View的高度
2.密碼為暗文顯示
3.帳號(hào)輸入框,return按鈕顯示next,沒(méi)有內(nèi)容不可點(diǎn)擊
4.密碼輸入框,return按鈕顯示done,沒(méi)有內(nèi)容不可點(diǎn)擊
5.取消輸入糾錯(cuò)的功能
7.輸入框提供小按鈕,當(dāng)在編輯并有內(nèi)容的時(shí)候顯示,點(diǎn)擊小按鈕刪除輸入框中內(nèi)容
8.提供當(dāng)切換為第一響應(yīng)時(shí),清空輸入框中的內(nèi)容
五.編寫(xiě)代碼
1.創(chuàng)建控制器,并拖線(xiàn)獲得帳號(hào).密碼.自動(dòng)登陸.記住密碼屬性,監(jiān)聽(tīng)三個(gè)按鈕的點(diǎn)擊
2.在登陸點(diǎn)擊按鈕中
2.1 獲取到帳號(hào)和密碼
2.2 判斷帳號(hào)密碼是否為空,如果為空,給予提示,并執(zhí)行抖動(dòng)動(dòng)畫(huà)
2.3 模擬提交服務(wù)器,判斷帳號(hào)密碼是否正確(默認(rèn)帳號(hào)和密碼都為123的時(shí)候正確),如果錯(cuò)誤給予提示,并執(zhí)行抖動(dòng)動(dòng)畫(huà)
3.為錯(cuò)誤提示抽出一個(gè)方法,并添加提示與抖動(dòng)動(dòng)畫(huà)
4.當(dāng)點(diǎn)擊登陸時(shí),退出鍵盤(pán)
5.設(shè)置自動(dòng)登陸與記住密碼邏輯
6.添加activityView在登陸按鈕右邊,并在登陸的時(shí)候轉(zhuǎn)動(dòng)
7.設(shè)置當(dāng)在帳號(hào)輸入框中點(diǎn)擊next,設(shè)置密碼輸入框?yàn)榈谝豁憫?yīng)者
8.設(shè)置當(dāng)在密碼輸入框中點(diǎn)擊done,開(kāi)始登陸
9.設(shè)置登陸界面背景為RGB為3個(gè)55/255.0,并清空其他背景顏色
10.設(shè)置狀態(tài)欄文字顏色為白色
- (void)showError:(NSString *)error {
1.錯(cuò)誤提示
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"登陸失敗" message:error preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:nil];
[alertVC addAction:action];
[self presentViewController:alertVC animated:YES completion:nil];
2.抖動(dòng)動(dòng)畫(huà)
CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"];
shakeAnim.values = @[@-10,@0,@10,@0];
shakeAnim.repeatCount = 3;
shakeAnim.duration = 0.1;
[self.loginView.layer addAnimation:shakeAnim forKey:nil];
}

? 五.圖片拉伸


1.png

? 1: 對(duì)圖片進(jìn)行拉伸:


2.png

2:在storyboard里進(jìn)行拉伸:
3.png

? 3.代碼拉伸:
? 參考:圖片之代碼拉伸
? 4.舉例:
? 拉伸前:

1.png
2.png

3.png

4.png

ios9之后(狀態(tài)欄背景顏色由控制器管理)

1.繼承(可以創(chuàng)建一個(gè)類(lèi)繼承UIViewController,其他的類(lèi)繼承這個(gè)UIViewController)

2.創(chuàng)建UIViewController分類(lèi),重寫(xiě)分類(lèi)方法,不過(guò)會(huì)有警告

去除警告

pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

Dock的初始化

一.創(chuàng)建詳情界面控制器

二.設(shè)置背景顏色與登陸界面背景顏色

self.view.backgroundColor

= [UIColor colorWithRed:55/255.0 green:55/255.0

blue:55/255.0
alpha:1.0];

三.跳轉(zhuǎn)詳情頁(yè)(當(dāng)帳號(hào)和密碼都為123)
1.以modal的形式進(jìn)入

HomeViewController
*homeVC = [[HomeViewController alloc] init];

[self presentViewController:homeVC animated:YES completion:nil];

2.以切換窗口的根控制的形式進(jìn)入
self.view.window.rootViewController = [[HomeViewController alloc] init];

四.自定義Dock,繼承UIView

五.初始化Dock

  • (void)setupDock

{

 1.創(chuàng)建Dock

Dock *dock = [[Dock alloc] init];

dock.backgroundColor = [UIColor redColor];

[self.view addSubview:dock];

self.dock = dock;

 2.高度隨父控件的拉伸而拉伸

dock.autoresizingMask = UIViewAutoresizingFlexibleHeight;

dock.height = self.view.height;

 3.通過(guò)當(dāng)前屏幕方向設(shè)置dock的寬度

BOOL isLandscape =self.view.width == 1024;

dock.width = isLandscape ? 270 : 70;

}

六.監(jiān)聽(tīng)屏幕旋轉(zhuǎn),設(shè)置dock的寬度

ios8 以前

  • (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
    duration:(NSTimeInterval)duration

{

 通過(guò)當(dāng)前屏幕方向設(shè)置dock的寬度

BOOL isLandscape =
toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft;

self.dock.width = isLandscape ? 270 :
70;

}

ios8 以后

  • (void)viewWillTransitionToSize:(CGSize)size
    withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

{

 通過(guò)當(dāng)前屏幕方向設(shè)置dock的寬度

BOOL isLandscape = size.width == 1024;

self.dock.width = isLandscape ? 270 :
70;

}

九.關(guān)于UIView的autoresizingMask屬性的研究

enum {

UIViewAutoresizingNone = 0,

UIViewAutoresizingFlexibleLeftMargin = 1 << 0,

UIViewAutoresizingFlexibleWidth = 1 <<
1,

UIViewAutoresizingFlexibleRightMargin = 1 << 2,

UIViewAutoresizingFlexibleTopMargin = 1 << 3,

UIViewAutoresizingFlexibleHeight = 1 << 4,

UIViewAutoresizingFlexibleBottomMargin = 1 << 5

};

UIViewAutoresizingNone就是不自動(dòng)調(diào)整靠娱。

UIViewAutoresizingFlexibleLeftMargin 自動(dòng)調(diào)整與superView左邊的距離,保證與superView右邊的距離不變锌雀。

UIViewAutoresizingFlexibleRightMargin 自動(dòng)調(diào)整與superView的右邊距離,保證與superView左邊的距離不變腋逆。

UIViewAutoresizingFlexibleTopMargin 自動(dòng)調(diào)整與superView頂部的距離侈贷,保證與superView底部的距離不變惩歉。

UIViewAutoresizingFlexibleBottomMargin 自動(dòng)調(diào)整與superView底部的距離,也就是說(shuō)撑蚌,與superView頂部的距離不變争涌。

UIViewAutoresizingFlexibleWidth 自動(dòng)調(diào)整自己的寬度亮垫,保證與superView左邊和右邊的距離不變伟骨。

UIViewAutoresizingFlexibleHeight 自動(dòng)調(diào)整自己的高度底靠,保證與superView頂部和底部的距離不變暑中。

UIViewAutoresizingFlexibleLeftMargin
|UIViewAutoresizingFlexibleRightMargin 自動(dòng)調(diào)整與superView左邊的距離,保證與左邊的距離和右邊的距離和原來(lái)距左邊和右邊的距離的比例不變稻轨。比如原來(lái)距離為20殴俱,30线欲,調(diào)整后的距離應(yīng)為68李丰,102逼泣,即68/20=102/30。

1.png

2.png

Dock中BottomMenu的初始化

一.在監(jiān)聽(tīng)屏幕方法中拿到屏幕選中的時(shí)間,添加dock改變寬度的動(dòng)畫(huà)效果

ios8 以前

duration 為屏幕旋轉(zhuǎn)的時(shí)間

(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration{}

ios8 以后

[coordinator
transitionDuration] 返回屏幕旋轉(zhuǎn)的時(shí)間

(void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{

}

(void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

{

 1.通過(guò)當(dāng)前屏幕方向設(shè)置dock的寬度

BOOL isLandscape = size.width ==
1024;

 2.獲取屏幕旋轉(zhuǎn)設(shè)置,設(shè)置dock寬度改變的動(dòng)畫(huà)時(shí)間

CGFloat duration = [coordinator transitionDuration];

[UIView animateWithDuration:duration animations:^{

  self.dock.width =

isLandscape ? 270 : 70;

}];

}

二.創(chuàng)建Dock子控件->底部菜單(BottomMenu),并設(shè)置BottomMenu的autoresizingMask屬性(當(dāng)旋轉(zhuǎn)屏幕時(shí),高度依舊為旋轉(zhuǎn)前Dock的高度,所以會(huì)導(dǎo)致BottomMenu的Y值不對(duì))

(void)setupBottomMenu

{

BottomMenu *menu = [[BottomMenu alloc] init];

menu.backgroundColor = [UIColor orangeColor];

[self addSubview:menu];

self.menu = menu;

設(shè)置menu與父控件頂部可拉伸,底部不變

menu.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;

}

三.Dock中的子控件設(shè)置frame需要知道屏幕方向,Dock對(duì)外提供一個(gè)告知當(dāng)前屏幕方向的方法

(void)rotateToLandscape:(BOOL)isLandscape;

dock中

(void)rotateToLandscape:(BOOL)isLandscape

{

 1.設(shè)置自身的frame

self.width = isLandscape ? kDockLandscapeWidth : kDockProtraitWidth;

 2.設(shè)置底部菜單的frame,告知底部菜單當(dāng)前屏幕方向

[self.menu rotateToLandscape:isLandscape];

}

底部菜單

  • (void)rotateToLandscape:(BOOL)isLandscape

{

1.設(shè)置自身的frame

self.width = self.superview.width;

self.height = isLandscape ? kDockItemHeight : kDockItemHeight * 3;

self.y = self.superview.height - self.height;

}

豎屏效果

1.png

2.png

添加IconButton和添加BottomMenu的子控件

一.添加中間的子控件Tabbar,并設(shè)置顏色,設(shè)置頂部可拉伸

  • (void)setupTabbar

{

Tabbar *tb = [[Tabbar alloc] init];

tb.backgroundColor = [UIColor purpleColor];

[self addSubview:tb];

self.tb = tb;

設(shè)置tabbar與父控件頂部可拉伸,底部不變

tb.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;

}

二.在Dock中告訴tabbar當(dāng)前屏幕方向,并設(shè)置Y值(因?yàn)閅值需要用到底部菜單的高度)

  • (void)rotateToLandscape:(BOOL)isLandscape

{

1.設(shè)置自身的frame

self.width = isLandscape ?
kDockLandscapeWidth : kDockProtraitWidth;

2.設(shè)置底部菜單的frame,告知底部菜單當(dāng)前屏幕方向

[self.menu
rotateToLandscape:isLandscape];

3.設(shè)置tabbar的frame,告知tabbar當(dāng)前屏幕方向

[self.tb
rotateToLandscape:isLandscape];

3.1設(shè)置tabbar的Y值(當(dāng)tabbar有高度之后再進(jìn)行設(shè)置)

self.tb.y = self.height

  • self.menu.height - self.tb.height;

}

三.設(shè)置Tabbar的frame,先設(shè)置寬高,再設(shè)置x,y

  • (void)rotateToLandscape:(BOOL)isLandscape
    {

    設(shè)置自身的frame

self.width = self.superview.width;

self.height = kDockItemHeight * 6;

}

四.添加頂部子控件IconButton

  • (void)setupIconButton

{

IconButton *ib = [[IconButton alloc] init];

ib.backgroundColor = [UIColor blueColor];

[self addSubview:ib];

self.ib = ib;

}

IconButton中獲取當(dāng)前屏幕方向,設(shè)置自身frame

  • (void)rotateToLandscape:(BOOL)isLandscape

{

設(shè)置自身frame

self.width = isLandscape ?
kIconButtonLandscapeWidth : kIconButtonProtraitWH;

self.height = isLandscape ?
kIconButtonLandscapeHeight : kIconButtonProtraitWH;

self.y = kIconButtonY;

self.x = (self.superview.width

  • self.width) * 0.5;

}

五.添加底部菜單子控件

  • (void)setupItemsWithImageName:(NSString *)imageName

{

UIButton *item = [[UIButton alloc] init];

1.設(shè)置圖標(biāo)

[item setImage:[UIImage imageNamed:imageName]
forState:UIControlStateNormal];

2.高亮背景顏色

[item setBackgroundImage:[UIImage imageNamed:@"tabbar_separate_selected_bg"]
forState:UIControlStateHighlighted];

[self addSubview:item];

}

  • (void)rotateToLandscape:(BOOL)isLandscape

{

0.獲取當(dāng)前子控件的個(gè)數(shù)

NSInteger count = self.subviews.count;

1.設(shè)置自身的frame

self.width = self.superview.width;

self.height = isLandscape ?
kDockItemHeight : kDockItemHeight * count;

self.y = self.superview.height

  • self.height;
2.設(shè)置子控件的frame

for (NSInteger i = 0; i < count;
i++) {

    2.1取出當(dāng)前的子控件


  UIButton *item = self.subviews[i];

    2.2設(shè)置子控件的frame


  item.width = isLandscape ? self.width

/ count : self.width;

  item.height = kDockItemHeight;


  item.x = isLandscape ? item.width * i : 0;


  item.y = isLandscape ? 0 : item.height * i;

}

}

豎屏效果

1.png

2.png

添加Tabbar的子控件

一.添加Tabbar子控件,并自定義TabbarItem繼承UIbutton

const CGFloat kRatio = 0.4;

  • (void)setupItemsWithImageName:(NSString *)imageName
    title:(NSString *)title

{

TabbarItem *item = [[TabbarItem alloc] init];

 1.設(shè)置文字

[item setTitle:title forState:UIControlStateNormal];

 2.設(shè)置圖標(biāo)

[item setImage:[UIImage imageNamed:imageName]
forState:UIControlStateNormal];

 3.選中背景圖片

[item setBackgroundImage:[UIImage imageNamed:@"tabbar_separate_selected_bg"]
forState:UIControlStateSelected];

 4.設(shè)置tag

item.tag = self.subviews.count;

[self addSubview:item];

 5.監(jiān)聽(tīng)點(diǎn)擊

[item addTarget:self action:@selector(itemClick:)
forControlEvents:UIControlEventTouchDown];

}

pragma mark - 事件點(diǎn)擊

  • (void)itemClick:(UIButton *)item

{

self.seletedBtn.selected =NO;

self.seletedBtn = item;

self.seletedBtn.selected =YES;

}

  • (void)rotateToLandscape:(BOOL)isLandscape

{

 0.獲取當(dāng)前子控件的個(gè)數(shù)

NSInteger count = self.subviews.count;

 1.設(shè)置自身的frame

self.width = self.superview.width;

self.height = kDockItemHeight *
count;

 2.設(shè)置子控件的frame

for (NSInteger i = 0; i < count;
i++) {

     2.1取出子控件


  UIButton *item = self.subviews[i];

     2.2設(shè)置子控件的frame


  item.width = self.width;


  item.height = kDockItemHeight;


  item.y = i * item.height;

}

}

@implementation
TabbarItem

  • (instancetype)initWithFrame:(CGRect)frame

{

if (self
= [super initWithFrame:frame]) {

     設(shè)置圖標(biāo)內(nèi)容模式


  self.imageView.contentMode

= UIViewContentModeCenter;

}

return

self;

}

返回UIButton圖片的frame

(CGRect)imageRectForContentRect:(CGRect)contentRect

{

 1.判斷當(dāng)前屏幕方向

if (self.width == self.height) { // 豎屏


  return self.bounds;

} else {  橫屏


  CGFloat width = self.width
  • kRatio;
  CGFloat height = self.height;


  CGFloat x = 0;


  CGFloat y = 0;


  return CGRectMake(x, y,

width, height);

}

}

返回UIButton文字的frame

(CGRect)titleRectForContentRect:(CGRect)contentRect

{

 1.判斷當(dāng)前屏幕方向

if (self.width == self.height) {  豎屏


  return CGRectZero;

} else {  橫屏


  CGFloat width = self.width
  • (1 - kRatio);
  CGFloat height = self.height;


  CGFloat x = self.width
  • kRatio;
  CGFloat y = 0;


  return CGRectMake(x, y,

width, height);

}

}

@end

豎屏效果

1.png

2.png

IconButton內(nèi)容設(shè)置和BottomMenu子控件點(diǎn)擊

一.IconButton設(shè)置文字與圖標(biāo)

  • (instancetype)initWithFrame:(CGRect)frame

{

if (self
= [super initWithFrame:frame]) {

    1.設(shè)置圖片


  [self setImage:[UIImage

imageNamed:@"Easy"]
forState:UIControlStateNormal];

    2.設(shè)置文字

    [self setTitle:@"哈哈" forState:UIControlStateNormal];


  self.titleLabel.textAlignment

= NSTextAlignmentCenter;

}

return

self;

}

返回UIButton中圖片frame

(CGRect)imageRectForContentRect:(CGRect)contentRect

{

1.判斷當(dāng)前屏幕方向

if (self.width == self.height) {  豎屏


  return self.bounds;

} else {  橫屏


  CGFloat width = self.width;


  CGFloat height = width;


  CGFloat x = 0;


  CGFloat y = 0;


  return CGRectMake(x, y,

width, height);

}

}

返回UIButton中文字frame

(CGRect)titleRectForContentRect:(CGRect)contentRect

{

 1.判斷當(dāng)前屏幕方向

if (self.width == self.height) {  豎屏


  return CGRectZero;

} else {  橫屏


  CGFloat width = self.width;


  CGFloat height = kIconButtonLandscapeTitleH;


  CGFloat x = 0;


  CGFloat y = width;


  return CGRectMake(x, y,

width, height);

}

}

二.監(jiān)聽(tīng)BottomMenu的點(diǎn)擊,使用代理,并設(shè)置按鈕枚舉類(lèi)型

typedef enum {

BottomMenuTypeMood,  發(fā)表心情

BottomMenuTypePhoto, 發(fā)表相冊(cè)

BottomMenuTypeBlog,  發(fā)表日志

}
BottomMenuType;

  • (instancetype)initWithFrame:(CGRect)frame

{

if (self
= [super initWithFrame:frame]) {

    初始化子控件


  [self

setupItemsWithImageName:@"tabbar_mood"
type:BottomMenuTypeMood];

  [self

setupItemsWithImageName:@"tabbar_photo"
type:BottomMenuTypePhoto];

  [self

setupItemsWithImageName:@"tabbar_blog"
type:BottomMenuTypeBlog];

}

return

self;

}

pragma mark - 初始化子控件

  • (void)setupItemsWithImageName:(NSString *)imageName
    type:(BottomMenuType)type

{

UIButton *item = [[UIButton alloc] init];

1.設(shè)置圖標(biāo)

[item setImage:[UIImage imageNamed:imageName]
forState:UIControlStateNormal];

2.高亮背景顏色

[item setBackgroundImage:[UIImage imageNamed:@"tabbar_separate_selected_bg"]
forState:UIControlStateHighlighted];

[self addSubview:item];

3.設(shè)置tag

item.tag = type;

4.監(jiān)聽(tīng)事件點(diǎn)擊

[item addTarget:self action:@selector(itemClick:)
forControlEvents:UIControlEventTouchUpInside];

}

pragma mark - 事件點(diǎn)擊

  • (void)itemClick:(UIButton *)item

{

if ([self.delegate
respondsToSelector:@selector(menu:didClickBottomMenuType:)])
{

  [self.delegate menu:self didClickBottomMenuType:(int)item.tag];

}

}

三.讓控制器成為BottomMenu的代理,講BottomMenu屬性允許訪(fǎng)問(wèn),并設(shè)置只讀模式

/** 底部菜單*/

@property (nonatomic, weak, readonly) BottomMenu
*menu;

四.實(shí)現(xiàn)代理方法,并創(chuàng)建mood控制器,以modal的形式彈出

  • (void)menu:(BottomMenu *)menu
    didClickBottomMenuType:(BottomMenuType)type

{

switch (type) {

  case

BottomMenuTypeMood:

  {


      MoodViewController *moodVC =

[[MoodViewController alloc] init];

      CustomNavigationController *moodNav =

[[CustomNavigationController alloc] initWithRootViewController:moodVC];

      moodNav.modalPresentationStyle =

UIModalPresentationFormSheet;

      [self

presentViewController:moodNav animated:YES
completion:nil];

  }


      break;


     


  case

BottomMenuTypePhoto:

        NSLog(@"點(diǎn)擊了發(fā)表圖片");


      break;


     


  case

BottomMenuTypeBlog:

        NSLog(@"點(diǎn)擊了發(fā)表日志");


      break;


     


  default:


      break;

}

}

豎屏效果

1.png

2.png


modal的介紹
1.呈現(xiàn)樣式 :Modal出來(lái)的控制器滋早,最終顯示出來(lái)的樣子
Modal常見(jiàn)有4種呈現(xiàn)樣式

UIModalPresentationFullScreen :全屏顯示(默認(rèn))

UIModalPresentationPageSheet

寬度:豎屏?xí)r的寬度(768)
高度:當(dāng)前屏幕的高度(填充整個(gè)高度)

UIModalPresentationFormSheet :占據(jù)屏幕中間的一小塊

UIModalPresentationCurrentContext :跟隨父控制器的呈現(xiàn)樣式

1.過(guò)渡樣式
:Modal出來(lái)的控制器杆麸,是以怎樣的動(dòng)畫(huà)呈現(xiàn)出來(lái)

Modal一共4種過(guò)渡樣式

UIModalTransitionStyleCoverVertical :從底部往上鉆(默認(rèn))

UIModalTransitionStyleFlipHorizontal :三維翻轉(zhuǎn)

UIModalTransitionStyleCrossDissolve :淡入淡出

UIModalTransitionStylePartialCurl :翻頁(yè)(只顯示部分昔头,使用前提:呈現(xiàn)樣式必須是UIModalPresentationFullScreen)

tabbar點(diǎn)擊和全部動(dòng)態(tài)的UISegmentControl

1.tabbar代理監(jiān)聽(tīng)點(diǎn)擊

@class Tabbar;

@protocol TabbarDelegate <NSObject>

@optional

(void)tabbar:(Tabbar *)tabbar
from:(NSInteger)from to:(NSInteger)to;

@end

pragma mark - 事件點(diǎn)擊

(void)itemClick:(UIButton *)item

{

1.調(diào)用代理方法

if ([self.delegate
respondsToSelector:@selector(tabbar:from:to:)])
{

  [self.delegate tabbar:self from:self.seletedBtn.tag

to:item.tag];

}

2.點(diǎn)擊反選

self.seletedBtn.selected =NO;

self.seletedBtn = item;

self.seletedBtn.selected =YES;

}

pragma mark Tabbar代理

(void)tabbar:(Tabbar *)tabbar
from:(NSInteger)from to:(NSInteger)to

{

1.獲取上一個(gè)下標(biāo)控制器的View,并從self.view中移除

UIViewController *previousVC = self.childViewControllers[from];

[previousVC.view removeFromSuperview];

2.獲取當(dāng)前小標(biāo)控制器的View,并添加到self.view中

UIViewController *currentVC = self.childViewControllers[to];

[self.contentView
addSubview:currentVC.view];

3.設(shè)置當(dāng)前內(nèi)容View的frame

currentVC.view.frame = self.contentView.bounds;

4.記錄當(dāng)前控制器下標(biāo)

self.currentIndex = to;

}

二.IconButton點(diǎn)擊

初始化Dock中監(jiān)聽(tīng)I(yíng)conButton點(diǎn)擊

pragma mark IconButton點(diǎn)擊

(void)iconButtonClick

{

1.切換內(nèi)容控制器

[self tabbar:nil
from:self.currentIndex to:self.childViewControllers.count - 1];

2.取消其他選中

[self.dock.tb unSeleted];

}

三.創(chuàng)建全部動(dòng)態(tài)控制器,設(shè)置導(dǎo)航條textView為UISegmentController

(void)viewDidLoad {

[super viewDidLoad];

1.設(shè)置背景顏色

self.view.backgroundColor = [UIColor
whiteColor];

2.設(shè)置中間segmentController

UISegmentedControl *segControl =

[[UISegmentedControl alloc] initWithItems:@[@"全部", @"特別關(guān)心", @"好友動(dòng)態(tài)", @"認(rèn)證空間"]];

self.navigationItem.titleView =
segControl;

segControl.selectedSegmentIndex = 0;

3.設(shè)置UISegmentedControl顏色

segControl.tintColor = [UIColor lightGrayColor];

NSDictionary *attrDict = @{NSForegroundColorAttributeName: [UIColor
blackColor]};

[segControl setTitleTextAttributes:attrDict
forState:UIControlStateNormal];

4.監(jiān)聽(tīng)UISegmentedControl點(diǎn)擊

[segControl addTarget:self action:@selector(segControlClick:)
forControlEvents:UIControlEventValueChanged];

}

(void)segControlClick:(UISegmentedControl
*)segControl

{

NSLog(@"%ld",segControl.selectedSegmentIndex);

}

四:去除背景色
豎屏效果


1.png

橫屏效果


2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盅视,隨后出現(xiàn)的幾起案子闹击,更是在濱河造成了極大的恐慌成艘,老刑警劉巖淆两,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秋冰,死亡現(xiàn)場(chǎng)離奇詭異丹莲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盯另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)鸳惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芝发,“玉大人苛谷,你說(shuō)我怎么就攤上這事腹殿÷辔荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我晒喷,道長(zhǎng)厨埋,這世上最難降的妖魔是什么捐顷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任迅涮,我火速辦了婚禮叮姑,結(jié)果婚禮上传透,老公的妹妹穿的比我還像新娘极颓。我一直安慰自己菠隆,他們只是感情好骇径,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布破衔。 她就那樣靜靜地躺著,像睡著了一般校仑。 火紅的嫁衣襯著肌膚如雪迄沫。 梳的紋絲不亂的頭發(fā)上卦方,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音逝她,去河邊找鬼黔宛。 笑死擒贸,一個(gè)胖子當(dāng)著我的面吹牛介劫,可吹牛的內(nèi)容都是我干的座韵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼代咸!你這毒婦竟也來(lái)了蹬屹?” 一聲冷哼從身側(cè)響起慨默,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厦取,失蹤者是張志新(化名)和其女友劉穎虾攻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奇钞,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡景埃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年谷徙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了完慧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈尼。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸿染,死狀恐怖乞巧,靈堂內(nèi)的尸體忽然破棺而出绽媒,到底是詐尸還是另有隱情是辕,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站棺聊,受9級(jí)特大地震影響贞谓,放射性物質(zhì)發(fā)生泄漏裸弦。R本人自食惡果不足惜理疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一窖贤、第九天 我趴在偏房一處隱蔽的房頂上張望暇矫。 院中可真熱鬧李根,春花似錦房轿、人聲如沸所森。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)上鞠。三九已至,卻和暖如春世曾,著一層夾襖步出監(jiān)牢的瞬間轮听,已是汗流浹背血巍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工藻茂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玫恳,地道東北人京办。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓惭婿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親折晦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子满着,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • { 11风喇、核心動(dòng)畫(huà) 需要簽協(xié)議魂莫,但是系統(tǒng)幫簽好 一耙考、CABasicAnimation 1鲸沮、創(chuàng)建基礎(chǔ)動(dòng)畫(huà)對(duì)象 CAB...
    CYC666閱讀 1,530評(píng)論 2 4
  • 廢話(huà)不多說(shuō)讼溺,直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,336評(píng)論 0 15
  • //設(shè)置尺寸為屏幕尺寸的時(shí)候self.window = [[UIWindow alloc] initWithFra...
    LuckTime閱讀 793評(píng)論 0 0
  • 照片是記錄生活美好的方式,不過(guò)微信剔猿、微博的曬照模式總是千篇一律的九宮格归敬,缺少創(chuàng)作的趣味鄙早。畫(huà)報(bào)是一款注重圖片與文字的...
    最美應(yīng)用閱讀 561評(píng)論 0 4
  • 當(dāng)我躲雨限番,悄悄將身體藏匿于別人傘下時(shí)弥虐,心里慶幸自己個(gè)子不高,偷偷看向身前的女生珠插,頭發(fā)黑長(zhǎng)直捻撑,瘦瘦的布讹,應(yīng)該長(zhǎng)得挺漂亮...
    丁水姑娘閱讀 223評(píng)論 0 0