p 在iOS開(kāi)發(fā)中, 我們可以通過(guò)Storyboard或Xib進(jìn)行可視化界面的布局, 然后使用AutoLayout進(jìn)行屏幕適配, 此時(shí)我們?cè)谀M器上運(yùn)行是比較費(fèi)時(shí)的, 原因是要切換到不同大小的屏幕上觀看樣式, 而切換模擬器需要一定的時(shí)間, 如果Mac的性能較差, 那就非常痛苦了

南潯網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),南潯網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為南潯上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的南潯做網(wǎng)站的公司定做!
p不過(guò)Xcode上已經(jīng)給我們添加了一個(gè)不需要切換模擬器就能預(yù)覽各個(gè)屏幕上界面的功能
p以下就是可視化界面布局的預(yù)覽功能流程圖:
效果圖
.h
```
@interfaceVMTagsView :UIView
/**
*根據(jù)傳入的要布局的總寬度和標(biāo)題數(shù)組返回總高度和封裝好的view的字典對(duì)應(yīng)key為height tagsview
*
*@param titleArray標(biāo)題數(shù)組
*@param allWidth需要布局的寬度
*
*@return
*/
+ (NSDictionary*)tagsViewForTitleArray:(NSArray*)titleArray andWidth:(CGFloat)allWidth;
/**
*根據(jù)傳入的布局的總寬度和標(biāo)題數(shù)組返回總高度和下面的init配合使用和上面效果一樣
*
*@param titleArray標(biāo)題數(shù)組
*@param allWidth需要布局的寬度
*
*@return總高度
*/
+ (CGFloat)tagsViewHeightForTitleArray:(NSArray*)titleArray andWidth:(CGFloat)allWidth;
- (instancetype)initWithFrame:(CGRect)frame titleArray:(NSArray*)titleArray;
/**
*view上button被點(diǎn)擊的block回調(diào) 參數(shù)為被點(diǎn)擊button的序號(hào)
*/
@property(nonatomic,copy)void(^buttonClickedBlock)(NSInteger);
@end
```
.m
```
#import"VMTagsView.h"
#define kButtonHeight28
#define KColorFromRGB(rgbValue) \
[UIColor colorWithRed:((float)((rgbValue 0xFF0000) 16))/255.0\
green:((float)((rgbValue 0xFF00) 8))/255.0\
blue:((float)(rgbValue 0xFF))/255.0alpha:1.0]
#define kMainTextGrayColorKColorFromRGB(0x5d5d5d)
#define Font(FONT)[UIFont systemFontOfSize:FONT]
#define kCommenFont14
@interfaceVMTagsView()
/**
*存放創(chuàng)建的button用于取下標(biāo)或者找對(duì)應(yīng)的button也可以用tag,但我覺(jué)得太low
*/
@property(nonatomic,strong)NSMutableArray*buttonArr;
@property(nonatomic)NSIntegerindex;
@end
@implementationVMTagsView
- (NSMutableArray*)buttonArr {
if(!_buttonArr) {
_buttonArr= [[NSMutableArrayalloc]init];
}
return_buttonArr;
}
- (instancetype)initWithFrame:(CGRect)frame titleArray:(NSArray*)titleArray {
self= [superinitWithFrame:frame];
if(self) {
[selfcreatSubviewsWithWidth:frame.size.widthtitleArray:titleArray];
}
returnself;
}
- (CGFloat)creatSubviewsWithWidth:(CGFloat)allWidth titleArray:(NSArray*)titleArray{
CGFloatx =0;
CGFloatnowWidth =0;
CGFloatnextWidth =0;
intnum_per_line =0;//每行btn的個(gè)數(shù)
intnum_of_line =0;//行數(shù)
for(inti =0; i titleArray.count; i ++) {
UIButton*button = [UIButtonbuttonWithType:UIButtonTypeCustom];
//添加到數(shù)組內(nèi)
[self.buttonArraddObject:button];
[buttonaddTarget:selfaction:@selector(buttonAction:)forControlEvents:UIControlEventTouchUpInside];
[buttonsetTitleColor:kMainTextGrayColorforState:UIControlStateNormal];
button.layer.borderColor=KColorFromRGB(0xE1E1E1).CGColor;
button.layer.borderWidth=1;
button.layer.cornerRadius=kButtonHeight/2;
button.layer.masksToBounds=YES;
button.titleLabel.font=Font(kCommenFont);
[buttonsetTitle:titleArray[i]forState:UIControlStateNormal];
[selfaddSubview:button];
CGFloattitleWidth = [VMTagsViewwidthForText:titleArray[i]andFontSize:kCommenFontheight:10];
titleWidth +=15;//給按鈕標(biāo)題距離左右邊框留點(diǎn)間距
nextWidth = nextWidth + titleWidth +10;//將要布局下一個(gè)按鈕的寬度
if(nextWidth allWidth) {
//如果大于限定的寬度置0另起一行
nextWidth =0;
nextWidth = nextWidth + titleWidth;
num_of_line ++;
nowWidth =0;
nowWidth = nowWidth + titleWidth;
num_per_line =0;
button.frame=CGRectMake(x,5+ (kButtonHeight+10) * num_of_line, titleWidth,kButtonHeight);
}else{
button.frame=CGRectMake(x + nowWidth + num_per_line *10,5+ (kButtonHeight+10) * num_of_line, titleWidth,kButtonHeight);
nowWidth = nowWidth + titleWidth;
}
num_per_line ++;
}
return(kButtonHeight+10) * (num_of_line +1);
}
+ (CGFloat)tagsViewHeightForTitleArray:(NSArray*)titleArray andWidth:(CGFloat)allWidth{
CGFloatnowWidth =0;
CGFloatnextWidth =0;
intnum_per_line =0;//每行btn的個(gè)數(shù)
intnum_of_line =0;//行數(shù)
for(inti =0; i titleArray.count; i ++) {
CGFloattitleWidth = [selfwidthForText:titleArray[i]andFontSize:kCommenFontheight:10];
titleWidth +=15;
nextWidth = nextWidth + titleWidth +10;
if(nextWidth allWidth) {
nextWidth =0;
nextWidth = nextWidth + titleWidth;
num_of_line ++;
nowWidth =0;
nowWidth = nowWidth + titleWidth;
num_per_line =0;
}else{
nowWidth = nowWidth + titleWidth;
}
num_per_line ++;
}
CGFloatallheight = (kButtonHeight+10) * (num_of_line +1);
returnallheight;
}
+ (NSDictionary*)tagsViewForTitleArray:(NSArray*)titleArray andWidth:(CGFloat)allWidth {
VMTagsView*tagsview = [[selfalloc]init];
CGFloatheight = [tagsviewcreatSubviewsWithWidth:allWidthtitleArray:titleArray];
return@{@"height":@(height),@"tagsview":tagsview};
}
/**
*點(diǎn)擊事件
*
*@param button
*/
- (void)buttonAction:(UIButton*)button {
UIButton*btn = (UIButton*)[self.buttonArrobjectAtIndex:self.index];
[btnsetTitleColor:kMainTextGrayColorforState:UIControlStateNormal];
btn.layer.borderColor=KColorFromRGB(0xE1E1E1).CGColor;
[buttonsetTitleColor:[UIColorredColor]forState:UIControlStateNormal];
button.layer.borderColor= [UIColorredColor].CGColor;
NSIntegerindex = [self.buttonArrindexOfObject:button];
self.buttonClickedBlock(index);
self.index= index;
}
+ (CGFloat)widthForText:(NSString*)text andFontSize:(CGFloat)fontSize height:(CGFloat)height {
NSDictionary*textDic =@{NSFontAttributeName:Font(fontSize)};
CGSizesize = [textboundingRectWithSize:CGSizeMake(0, height)options:NSStringDrawingUsesLineFragmentOriginattributes:textDiccontext:nil].size;
returnsize.width;
}
```
Git: 傳送門(mén)
以前做android的時(shí)候已經(jīng)覺(jué)得布局方便的不行,幾種簡(jiǎn)單的布局容器,再加上停靠和weight,基本所有需求都能滿(mǎn)足,后來(lái)接觸ios開(kāi)發(fā),一開(kāi)始還擔(dān)心自動(dòng)布局復(fù)雜,學(xué)習(xí)成本高。接觸幾天后發(fā)現(xiàn),一旦找到竅門(mén),在布局的自由度上更勝android一籌,簡(jiǎn)直就是想怎么玩就怎么玩。
一:總
自動(dòng)布局的核心用一句話表示就是:通過(guò)各種方法“確定”控件的位置和大小。這里的各種方法就是約束。
二:約束
(1)位置類(lèi)約束
以上約束來(lái)舉例,可以設(shè)置本控件的上邊距離其它控件位置點(diǎn)(位置點(diǎn)包括:上下左右和中間)的距離。這里的距離是一個(gè)等式,可以通過(guò)這樣的方式來(lái)理解:y=ax+b;y是最后設(shè)置的效果距離值,x是其他控件位置點(diǎn)的距離值,至于a,b都是你可以設(shè)置的參數(shù)值。使用時(shí),本控件的位置點(diǎn)可以按需自由的參照其他控件的位置點(diǎn)來(lái)設(shè)置約束。比如,本控件的水平中間點(diǎn)可以等于父容器控件的水平中間點(diǎn),這樣就實(shí)現(xiàn)了水平居中。
(2)大小類(lèi)約束
印象中就三個(gè):寬,高,寬高比
三:最后
位置類(lèi)約束和大小約束沒(méi)必要都使用上,只要現(xiàn)有約束已經(jīng)確定大小和位置了就沒(méi)必要加冗余約束,會(huì)引起沖突。比如,你設(shè)置了一個(gè)控件的上下左右約束,這時(shí)候不僅位置,大小也都確定了。還有文字類(lèi)的控件(UILabel類(lèi)),本身就自帶大小,所以可以不指定寬高。
待補(bǔ)充。。
狀態(tài)欄:40px???????? 導(dǎo)航欄:88px?????????標(biāo)簽欄:98px
狀態(tài)欄:40px???????? 導(dǎo)航欄:88px?????????標(biāo)簽欄:98px
狀態(tài)欄:60px???????? 導(dǎo)航欄:132px?????????標(biāo)簽欄:147px
狀態(tài)欄:132px???????? 導(dǎo)航欄:132px?????????標(biāo)簽欄:147px
狀態(tài)欄:88px???????? 導(dǎo)航欄:88px?????????標(biāo)簽欄:98px
全局邊距: 32px、30px、24px、20px(建議最小20px,邊距數(shù)字選擇偶數(shù))
卡片間距: 20px、24px、30px、40px(通常上下間距最小不低于16px,過(guò)小的間距會(huì)造成用戶(hù)的緊張情緒)
最常用的兩種布局方式,列表式和卡片式
「信息」頁(yè)面通常采用列表式布局。注:列表舒適體驗(yàn)的最小高度是80px,最大高度視內(nèi)容而定。
例: 微信高度:136px????QQ高度:132px???? 自如高度110px???? 唯品會(huì)高度:106px。
每張卡片的內(nèi)容和形式都是相互獨(dú)立的互不干擾。
卡片本身一般是白色,而卡片之間的間距顏色一般是淺色,不同產(chǎn)品風(fēng)格顏色可能不同。
雙欄卡片布局形式,常見(jiàn)于圖片信息為主導(dǎo),每一屏顯示至少4張卡片。
常見(jiàn)圖片尺寸比例:16:9、4:3、1:1、1:0.618(黃金比例)等
對(duì)齊、對(duì)稱(chēng)、分組
文字是APP中最核心的元素,是產(chǎn)品傳達(dá)給用戶(hù)的主要內(nèi)容。
在APP中字號(hào)范圍一般在20-36之間(@2x)。iOS 11中出現(xiàn)了大標(biāo)題的設(shè)計(jì),字號(hào)還是要根據(jù)產(chǎn)品屬性酌情設(shè)定。
36px: 用在少數(shù)標(biāo)題。例:導(dǎo)航標(biāo)題、分類(lèi)名稱(chēng)等。
32px: 用在少數(shù)標(biāo)題。例:店鋪標(biāo)題等。
30px: 用在較為重要的文字或操作按鈕。例:列表性標(biāo)題分類(lèi)名稱(chēng)等。
28px: 用于段落文字。例:列表性商品標(biāo)題等。
26px: 用于段落文字。例:小標(biāo)題模塊描述等。
24px: 用于輔助性文字。例:次要的標(biāo)語(yǔ)等。
22px: 用于輔助性文字。例:次要的備注信息等。
iOS 主流設(shè)備的分辨率分別是:
640x1136px:【(@2x)iPhone SE? 】
750 x1134px:【(@2x)iPhone6s/7/8? 】
1242x2208px:【(@3x)iPhone 6s/7/8 Plus? 】
1125x2436px:【(@3x)iPhone X?】
750x1624px:【(@2x)iPhone X?】
注: 基準(zhǔn)設(shè)計(jì)尺寸:750px?x?1334px。
目錄:
注意:
- 不管以上那種情況,scrollView 本身的大小和位置一定要相對(duì)固定!
- 可以使用frame直接設(shè)置,也可以使用自動(dòng)布局設(shè)置。
根據(jù)排列組合,共有 2*2 = 4 中情況,下面分別分析:
這種情況沒(méi)什么好說(shuō)的,直接設(shè)置即可。
這種情況相當(dāng)于是第四種情況的簡(jiǎn)化版,故請(qǐng)先看[第四種方式]。
我們知道,只要設(shè)置 scrollView 的 contentSize,就限定了 scrollView 的可滾動(dòng)范圍。所以這種情況,并不能很好的根據(jù)子控件的變化而動(dòng)態(tài)顯示完整的內(nèi)容。
所以子控件bounds變化的情況,需要使用[第四種方式]設(shè)置。
首先來(lái)做個(gè)分析:
第1條,兩種設(shè)置方式,自己根據(jù)實(shí)際情況選擇一種即可;
第2條,將所有子視圖塞進(jìn)一個(gè)容器視圖中。即先給scrollView添加一個(gè) 唯一直接子視圖 。
通俗點(diǎn)說(shuō)就是創(chuàng)建一個(gè) sizeView 設(shè)置其大小(直接設(shè)置frame或者使用autolayout設(shè)置皆可),然后將其添加到scrollView的子視圖,其他七七八八的所有小子視圖都添加在這個(gè)直接子視圖 sizeView 中,這個(gè)直接子視圖就相當(dāng)于 contentView。
這樣只要設(shè)置這個(gè)直接子視圖 sizeView 的大小和約束就好了。
如果設(shè)置好了這個(gè)直接子視圖 sizeView 的約束,那么這個(gè)直接子視圖 sizeView 的范圍就是 scrollView 的滾動(dòng)范圍嘍!
第3條,其實(shí)設(shè)置子視圖布局就2個(gè)要點(diǎn):
如圖1、圖2
圖2為豎直、水平方向皆可滾動(dòng),注意觀察滾動(dòng)條位置。
圖2為豎直、水平方向皆可滾動(dòng),注意觀察滾動(dòng)條位置。
如此設(shè)置布局是不是很方便呢?
本文名稱(chēng):ios開(kāi)發(fā)布局,iOS開(kāi)發(fā)吧
網(wǎng)站URL:http://chinadenli.net/article49/dsisoeh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、Google、品牌網(wǎng)站建設(shè)、服務(wù)器托管、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)