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(...)