iOS UI 基礎筆記

Li文/馬文濤(簡書作者)

原文鏈接:http://www.reibang.com/p/a86300ec106c

著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標注“簡書作者”。

UI Basic Note

UIView的常用方法

獲取父/子控件

@property(nonatomic,readonly) UIView *superview;

獲得自己的父控件對象

@property(nonatomic,readonly,copy) NSArray *subviews;獲得自己的所有子控件對象

@property(nonatomic) NSInteger tag;

控件的ID(標識)啊央,父控件可以通過tag來找到對應的子控件。

@property(nonatomic) CGAffineTransform transform;控件的形變屬性(可以設置旋轉(zhuǎn)角度、比例縮放层扶、平移等屬性)

添加刪除控件

- (void)addSubview:(UIView *) view;添加一個子控件view

- (void)removeFromSuperview;從父控件中移除

- (UIView *)viewWithTag:(NSInteger)tag;根據(jù)一個tag標識找出對應的控件(一般都是子控件)

控件的位置

@property(nonatomic) CGRect frame;控件矩形框在父控件中的位置和尺寸(以父控件的左上角為坐標原點)

@property(nonatomic) CGRect bounds;控件矩形框的位置和尺寸(以自己左上角為坐標原點,所以bounds的x烙荷、y一般為0)

@property(nonatomic) CGPoint center;控件中點的位置(以父控件的左上角為坐標原點)

UIImageView

UIImageView的常用屬性

@property(nonatomic,retain) UIImage *image;顯示的圖片

@property(nonatomic,copy) NSArray *animationImages;

顯示的動畫圖片

@property(nonatomic) NSTimeInterval animationDuration;動畫圖片的持續(xù)時間

@property(nonatomic) NSInteger animationRepeatCount;

動畫的播放次數(shù)(默認是0镜会,代表無限播放)

動畫

- (void)startAnimating;開始動畫

- (void)stopAnimating;停止動畫

- (BOOL)isAnimating;是否正在執(zhí)行動畫

contentMode屬性

帶有scale單詞的:圖片有可能會拉伸

UIViewContentModeScaleToFill

將圖片拉伸至填充整個imageView

圖片顯示的尺寸跟imageView的尺寸是一樣的

帶有aspect單詞的:保持圖片原來的寬高比

UIViewContentModeScaleAspectFit

保證剛好能看到圖片的全部

UIViewContentModeScaleAspectFill

拉伸至圖片的寬度或者高度跟imageView一樣

沒有scale單詞的:圖片絕對不會被拉伸,保持圖片的原尺寸

UIViewContentModeCenter

UIViewContentModeTop

UIViewContentModeBottom

UIViewContentModeLeft

UIViewContentModeRight

UIViewContentModeTopLeft

UIViewContentModeTopRight

UIViewContentModeBottomLeft

UIViewContentModeBottomRight

initWithImage:方法

利用這個方法創(chuàng)建出來的imageView的尺寸和傳入的圖片尺寸一樣

延遲調(diào)用方法

[abcperformSelector:@selector(stand:)withObject:@"123"afterDelay:10];//10s后自動調(diào)用abc的stand:方法终抽,并且傳遞@"123"參數(shù) makeObjectsPerformSelector 讓數(shù)組中所有對象都執(zhí)行者個方法

UILabel

常見屬性

@property(nonatomic,copy) NSString *text;顯示的文字

@property(nonatomic,retain) UIFont *font;字體

@property(nonatomic,retain) UIColor *textColor;文字顏色

@property(nonatomic) NSTextAlignment textAlignment;對齊模式(比如左對齊戳表、居中對齊、右對齊)

@property(nonatomic) NSInteger numberOfLines;文字行數(shù)

@property(nonatomic) NSLineBreakMode lineBreakMode;

換行模式

UIFont 常用方法

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize;系統(tǒng)默認字體

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize;粗體

+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize;斜體

UILabel實現(xiàn)包裹內(nèi)容

設置寬度約束為 <= 固定值

設置位置約束

不用去設置高度約束

修改frame的3種方式

直接使用CGRectMake函數(shù)

imageView.frame = CGRectMake(100,100,200,200);

利用臨時結(jié)構(gòu)體變量

CGRect tempFrame = imageView.frame; tempFrame.origin.x =100; tempFrame.origin.y =100; tempFrame.size.width =200; tempFrame.size.height =200; imageView.frame = tempFrame;

使用大括號{}形式

imageView.frame = (CGRect){{100,100}, {200,200}};

圖片的加載方式

有緩存

UIImage*image = [UIImageimageNamed:@"圖片名"];

使用場合:圖片比較小昼伴、使用頻率較高

建議把需要緩存的圖片直接放到Images.xcassets

無緩存

NSString*file = [[NSBundlemainBundle] pathForResource:@"圖片名"ofType:@"圖片的擴展名"];UIImage*image = [UIImageimageWithContentsOfFile:@"圖片文件的全路徑"];

使用場合:圖片比較大匾旭、使用頻率較小

不需要緩存的圖片不能放在Images.xcassets

放在Images.xcassets里面的圖片,只能通過圖片名去加載圖片

音頻播放

創(chuàng)建一個音頻文件的URL(URL就是文件路徑對象)

NSURL *url = [[NSBundle mainBundle] URLForResource:@"音頻文件名" withExtension:@"音頻文件的擴展名"];

創(chuàng)建播放器

self.player = [AVPlayer playerWithURL:url];

播放

[self.player play];

init 內(nèi)部會調(diào)用 initWithFrame方法

UIButton

監(jiān)聽按鈕點擊

[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];

凡是繼承自UIControl的控件圃郊,都可以通過addTarget:...方法來監(jiān)聽事件

自定義按鈕:調(diào)整內(nèi)部子控件的frame

方式1:實現(xiàn)titleRectForContentRect:和imageRectForContentRect:方法价涝,分別返回titleLabel和imageView的frame

方式2:在layoutSubviews方法中設置

內(nèi)邊距

設置按鈕內(nèi)容的內(nèi)邊距(影響到imageView和titleLabel)

@property(nonatomic) UIEdgeInsets contentEdgeInsets;

設置titleLabel的內(nèi)邊距(影響到titleLabel)

@property(nonatomic) UIEdgeInsets titleEdgeInsets;

設置imageView的內(nèi)邊距(影響到imageView)

@property(nonatomic)UIEdgeInsets imageEdgeInsets;

模型

概念

專門用來存放數(shù)據(jù)的對象

特點

一般直接繼承自NSObject

在.h文件中聲明一些用來存放數(shù)據(jù)的屬性

模型定義示例

@interfaceShop:NSObject/** 名字 */@property(nonatomic,strong)NSString*name;/** 圖標 */@preperty (nonatomic,strong)NSString*icon;@end

字典轉(zhuǎn)模型示例

-(instancetype)initWithDict:(NSDictionary*)dict? {if(self== [superinit]) {self.name= dict[@"name"];self.icon= dict[@"icon"];? ? ? }returnself;? }

Plist解析

獲得Plist文件的全路徑

NSBundle*bundle = [NSBundlemainBundle];NSString*path = [bundle pathForResource:@"shops"ofType:@"plist"];

加載plist文件

_shops = [NSArrayarrayWithContentsOfFile:path];

通過代碼自定義控件

繼承自系統(tǒng)自帶的控件,寫一個屬于自己的控件

目的:封裝控件內(nèi)部的細節(jié)持舆,不讓外界關心

步驟

新建一個繼承UIView的類

在initWithFrame:方法中添加子控件

在layoutSubviews方法中設置子控件的frame

一定要調(diào)用[super layoutSubviews];

提供一個模型屬性色瘩,重寫模型屬性的set方法

在set方法中取出模型屬性伪窖,給對應的子控件賦值

通過xib自定義控件

新建一個繼承UIView的類

新建一個xib文件(xib的文件名最好跟控件類名一樣)

添加子控件、設置子控件屬性

修改最外面那個控件的class為控件類名

將子控件進行連線

提供模型屬性居兆,重寫模型的set方法

在set方法中給子控件設置數(shù)據(jù)

- (void)awakeFromNib;xib 加載完成之后調(diào)用

view 封裝

如果一個view內(nèi)部的子控件比較多覆山,一般會考慮自定義一個view,把它內(nèi)部子控件的創(chuàng)建屏蔽起來泥栖,不讓外界關心

外界可以傳入對應的模型數(shù)據(jù)給view簇宽,view拿到模型數(shù)據(jù)后給內(nèi)部的子控件設置對應的數(shù)據(jù)

封裝控件的基本步驟

在initWithFrame:方法中添加子控件,提供便利構(gòu)造方法

在layoutSubviews方法中設置子控件的frame(一定要調(diào)用super的layoutSubviews)

增加模型屬性吧享,在模型屬性set方法中設置數(shù)據(jù)到子控件上晦毙,只要 frame 發(fā)生改變就會調(diào)用本方法。

控件初始化調(diào)用的方法

一個控件有2種創(chuàng)建方式

通過代碼創(chuàng)建

初始化時一定會調(diào)用initWithFrame:方法

通過xib\storyboard創(chuàng)建

-初始化時不會調(diào)用initWithFrame:方法耙蔑,只會調(diào)用initWithCoder:方法

初始化完畢后會調(diào)用awakeFromNib方法

有時候希望在控件初始化時做一些初始化操作见妒,比如添加子控件、設置基本屬性

這時需要根據(jù)控件的創(chuàng)建方式甸陌,來選擇在initWithFrame:须揣、initWithCoder:、awakeFromNib的哪個方法中操作

漸變動畫

方式1:頭尾式

[UIViewbeginAnimations:nilcontext:nil];? [UIViewsetAnimationDuration:2.0];/* 需要執(zhí)行動畫的代碼 */[UIViewcommitAnimations];

方式2:block式

[UIViewanimateWithDuration:2.0delay:1.0options:kNilOptions animations:^{/*需要執(zhí)行動畫的代碼 */} completion:nil]// 1s后钱豁,再執(zhí)行動畫(動畫持續(xù)2s)

圖片拉伸

iOS5之前

只拉伸中間的1x1區(qū)域

- (UIImage *)stretchableImageWithLeftCapWidth:? ? ? ? (NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;

iOS5開始

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode; (拉伸還是平鋪);

KVC

全稱:Key Value Coding(鍵值編碼)

賦值

(void)setValue:(id)value forKey:(NSString *)key;

(void)setValue:(id)value forKeyPath:(NSString *)keyPath;

(void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

取值

能取得私有成員變量的值

(id)valueForKey:(NSString *)key;

(id)valueForKeyPath:(NSString *)keyPath;

(NSDictionary)dictionaryWithValuesForKeys:(NSArray)keys;

KVO

全稱:Key Value Observing(鍵值監(jiān)聽)

作用:監(jiān)聽模型的屬性值改變

步驟

添加監(jiān)聽器

利用b對象來監(jiān)聽a對象name屬性的改變

[a addObserver:b forKeyPath:@"name"options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNewcontext:@"test"];

在監(jiān)聽器中實現(xiàn)監(jiān)聽方法

如果屬性發(fā)生改變會自動調(diào)用下面方法

```

(void)observeValueForKeyPath:(NSString)keyPath ofObject:(id)object change:(NSDictionary)change? ? context:(void *)context

{

NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);

}

```

如何監(jiān)聽控件的行為

通過addTarget:

只有繼承自UIControl的控件耻卡,才有這個功能

UIControlEventTouchUpInside : 點擊事件(UIButton)

UIControlEventValueChanged : 值改變事件(UISwitch、UISegmentControl牲尺、UISlider)

UIControlEventEditingChanged : 文字改變事件(UITextField)

addTarget調(diào)用的方法的參數(shù)可以把自己傳入進去

通過delegate

只有擁有delegate屬性的控件卵酪,才有這個功能

UIScrollView

UIScrollView的基本用法

添加內(nèi)容到UIScrollVive

設置 contentSize 屬性,滾動范圍

如果 UIScrollView 無法滾動

沒有設置 contentSize

scrollEnabled = NO谤碳;

userInteractionEnabled = NO 沒有用戶交互

設置按鈕的userInteractionEnabled并不能讓按鈕和其他控件達到這個狀態(tài)

注意點

通過代碼創(chuàng)建的scrollView沒有子控件(滾動條)

通過 storyBoard溃卡、xib 創(chuàng)建的會有滾動條

常見屬性

contentOffset用來表示偏移量,內(nèi)容左上角與 scrollview 的間距值

contentSize表示內(nèi)容的尺寸蜒简,滾動的范圍

contentInset內(nèi)間距瘸羡,scrollview 4周增加額外的滾動區(qū)域,一般用來避免scrollView的內(nèi)容被其他控件擋住

bounces是否需要彈簧效果

始終有彈簧效果(一般用于上/下拉刷新功能)搓茬,即使沒設置 contengSize 也會有效果

alwaysBounceVertical

alwaysBounceHorizontal

Delegate

設置代理為為控制器的對象(監(jiān)聽 scrollView 的各種行為) scrollView.delegate =控制器

在私有擴展里面(匿名分類)遵守協(xié)議

監(jiān)聽 scrollView 的滾動

- (void)scrollViewDidScroll只要 scrollView 滾動就會調(diào)用

- (void)scrollViewDidEndDragging...(BOOL)decelerate;停止?jié)L動有2種狀: decelerate? 為0表示停止?jié)L動犹赖,完全禁止,為1表示用戶停止拖拽卷仑,由于 scrollview 慣性峻村,會,會繼續(xù)滾動锡凝,并且減速

- (void)scrollViewDidEndDecelerating...表示停止減速

縮放

實現(xiàn)步驟

設置UIScrollView的id delegate代理對象

設置minimumZoomScale :縮小的最小比例

設置maximumZoomScale :放大的最大比例

讓代理對象實現(xiàn)下面的方法粘昨,返回需要縮放的視圖控件

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;用戶在UIScrollView身上使用捏合手勢時,UIScrollView會調(diào)用代理的viewForZoomingInScrollView:方法,這個方法返回的控件就是需要進行縮放的控件

分頁

UIScrollView 的 pageEnabled 設置 YES

@property(nonatomic) NSInteger numberOfPages;一共有多少頁

@property(nonatomic) NSInteger currentPage;當前顯示的頁碼

@property(nonatomic) BOOL hidesForSinglePage;只有一頁時雾棺,是否需要隱藏頁碼指示器

@property(nonatomic,retain) UIColor *pageIndicatorTintColor;其他指示器頁碼的顏色

@property(nonatomic,retain) UIColor*currentPageIndicatorTintColor;

當前頁碼指示器的顏色

NSTimer

NSTimer叫做“定時器”膊夹,它的作用如下

在指定的時間執(zhí)行指定的任務

每隔一段時間執(zhí)行指定的任務

調(diào)用下面的方法就會開啟一個定時任務

+ (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;? 每隔ti秒衬浑,調(diào)用一次aTarget的aSelector方法捌浩,yesOrNo決定了是否重復執(zhí)行這個任務

通過invalidate方法可以停止定時器的工作,一旦定時器被停止了工秩,就不能再次執(zhí)行任務尸饺。只能再創(chuàng)建一個新的定時器才能執(zhí)行新的任務

- (void)invalidate;

解決定時器在主線程不工作的問題

[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];

Autolayout

代碼創(chuàng)建

使用NSLayoutConstraint的類方法

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;? view1 :要約束的控件? attr1 :約束的類型(做怎樣的約束)? relation :與參照控件之間的關系? view2 :參照的控件? attr2 :約束的類型(做怎樣的約束)? multiplier :乘數(shù)? c :常量

添加約束對象到相應的view上

-(void)addConstraint:(NSLayoutConstraint *)constraint;-(void)addConstraints:(NSArray *)constraints;

代碼實現(xiàn)Autolayout的注意點

要先禁止autoresizing功能,設置view的下面屬性為NO

view.translatesAutoresizingMaskIntoConstraints = NO,添加約束之前助币,一定要保證相關控件都已經(jīng)在各自的父控件上不用再給view? ? 設置frame

約束規(guī)則創(chuàng)建約束之后浪听,需要將其添加到作用的view上

對于兩個同層級view之間的約束關系,添加到它們的父view上

對于兩個不同層級view之間的約束關系眉菱,添加到他們最近的共同父view上

對于有層次關系的兩個view之間的約束關系迹栓,添加到層次較高的父view上

VFL

全稱Visual Format Lanuage 可視化格式語言, 是蘋果公司為了簡化 autolayout 的編碼而推出的抽象語言

H:[cancelButton(72)]-12-[acceptButton(50)]? canelButton寬72,acceptButton寬50俭缓,它們之間間距12H:[wideView(>=60@700)]? wideView寬度大于等于60point克伊,該約束條件優(yōu)先級為700(優(yōu)先級最大值為1000,優(yōu)先級越高的約束越先被滿足)? V:[redBox][yellowBox(==redBox)]? 豎直方向上华坦,先有一個redBox愿吹,其下方緊接一個高度等于redBox高度的yellowBox? H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|? 水平方向上,F(xiàn)ind距離父view左邊緣默認間隔寬度惜姐,? 之后是FindNext距離Find間隔默認寬度犁跪;再之后是寬度不小于20的FindField它和FindNext以及父view右邊緣的間距都是默認寬度。? 豎線“|”表示superview的邊緣

使用VFL來創(chuàng)建約束數(shù)組

+ (NSArray*)constraintsWithVisualFormat:(NSString*)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary*)metrics views:(NSDictionary*)views;format :VFL語句opts :約束類型metrics :VFL語句中用到的具體數(shù)值views :VFL語句中用到的控件

創(chuàng)建一個字典(內(nèi)部包含VFL語句中用到的控件)的快捷宏定義

NSDictionaryOfVariableBindings(...)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歹袁,一起剝皮案震驚了整個濱河市坷衍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌条舔,老刑警劉巖惫叛,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逞刷,居然都是意外死亡嘉涌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門夸浅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仑最,“玉大人,你說我怎么就攤上這事帆喇【剑” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長预皇。 經(jīng)常有香客問我侈玄,道長,這世上最難降的妖魔是什么吟温? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任序仙,我火速辦了婚禮,結(jié)果婚禮上鲁豪,老公的妹妹穿的比我還像新娘潘悼。我一直安慰自己,他們只是感情好爬橡,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布治唤。 她就那樣靜靜地躺著,像睡著了一般糙申。 火紅的嫁衣襯著肌膚如雪宾添。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天柜裸,我揣著相機與錄音缕陕,去河邊找鬼。 笑死粘室,一個胖子當著我的面吹牛榄檬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衔统,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼鹿榜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锦爵?” 一聲冷哼從身側(cè)響起舱殿,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎险掀,沒想到半個月后沪袭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡樟氢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年冈绊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埠啃。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡死宣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碴开,到底是詐尸還是另有隱情毅该,我是刑警寧澤博秫,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站眶掌,受9級特大地震影響挡育,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朴爬,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一即寒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寝殴,春花似錦蒿叠、人聲如沸明垢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊银。三九已至抵蚊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溯革,已是汗流浹背贞绳。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留致稀,地道東北人冈闭。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像抖单,于是被迫代替她去往敵國和親萎攒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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