1右犹、修改光標顏色
UIView的屬性tintColor用于修改光標顏色
2提澎、圖片拉伸
代碼拉伸
//舊版本
@interface UIImage(UIImageDeprecated)
// use resizableImageWithCapInsets: and capInsets.
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight __TVOS_PROHIBITED;
@property(nonatomic,readonly) NSInteger leftCapWidth __TVOS_PROHIBITED; // default is 0. if non-zero, horiz. stretchable. right cap is calculated as width - leftCapWidth - 1
@property(nonatomic,readonly) NSInteger topCapHeight __TVOS_PROHIBITED; // default is 0. if non-zero, vert. stretchable. bottom cap is calculated as height - topCapWidth - 1
@end
leftCapWidth代表左側(cè)需要保護的部位(自動計算左側(cè)需要保護部分為width - leftCapWidth - 1)
topCapHeight代表頂部需要保護的部位(自動計算左側(cè)需要保護部分為height - topCapHeight - 1)
保留中間的1個點進行拉伸
//新版本
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); // create a resizable version of this image. the interior is tiled when drawn.
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode NS_AVAILABLE_IOS(6_0); // the interior is resized according to the resizingMode
capInsets代表上左下右四個方向需要保護的區(qū)域
拉伸區(qū)域可以根據(jù)需求定制
新特性(Assets)自動拉伸
(利用新特性拉伸圖片,編譯器會先自動確定一個拉伸區(qū)域和保護區(qū)域念链;如果圖片是對稱的盼忌,那么系統(tǒng)默認拉伸圖片中心的一個點积糯;如果不對稱,系統(tǒng)默認會自動保護不對稱區(qū)域谦纱,在此過程中還會避讓圓角不被拉伸看成,總之,相當智能)
//1服协、在Assets.xcassets中選擇要拉伸的圖片 //2绍昂、選擇窗口右上角圖片屬性 //3、在slicing->slices選擇Horizontal and Vertical選項偿荷,表示水平和垂直方向都拉伸即可 //4、新特性會自動計算拉伸區(qū)域和需要保護的區(qū)域唠椭,也可以手動編輯
新特性拉伸操作方法1
新特性拉伸操作方法2
3跳纳、修改背景alph值而不影響子控件的alph,子控件不繼承父控件的alph值
有時候我們需要修改控件的背景透明度贪嫂,但是子控件默認
回繼承父控件的透明度屬性寺庄,此時可以這樣干
self.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.1];
4、解決導(dǎo)航欄的標題不居中
//當導(dǎo)航欄的標題不居中力崇,在上一頁消失的時候?qū)祟}設(shè)為nil即可
5斗塘、坐標系轉(zhuǎn)換
convertRect
和convertPoint
作為UIView轉(zhuǎn)換坐標系的方法,是將view所在坐標系內(nèi)(即以view的左上角為坐標原點(0,0))
的一塊區(qū)域或者一個點的坐標
轉(zhuǎn)換到目標坐標系內(nèi)亮靴,這里的view
和區(qū)域以及點
是存在父子關(guān)系的馍盟。只能將父控件所在坐標系(即以父控件的左上角為坐標原點(0,0))內(nèi)部的區(qū)域或者點
轉(zhuǎn)換坐標系,否則會出現(xiàn)意想不到的錯誤茧吊。frame描述的是控件在其父控件坐標系內(nèi)的位置和尺寸贞岭,同一個坐標系內(nèi)的位置比較才是有意義的。
6搓侄、擴大UIButton的點擊區(qū)域
要擴大UIButton的點擊事件響應(yīng)范圍瞄桨,只需要重寫UIButton的hitTest方法
//將點擊事件響應(yīng)范圍擴大到周邊20個點
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect rect = self.frame;
//新的響應(yīng)事件的區(qū)域
//這里的區(qū)域是在父控件坐標系內(nèi)的
rect.origin.x -= 20;
rect.origin.y -= 20;
rect.size.height += 20 * 2;
rect.size.width += 20 * 2;
//將點轉(zhuǎn)換到與響應(yīng)事件的區(qū)域在同一個坐標系內(nèi)
CGPoint p = [self convertPoint:point toView:self.superview];
//判斷點是否在新的事件響應(yīng)區(qū)域內(nèi)
if (CGRectContainsPoint(rect, p))
{
return self;
}
else
{
return [super hitTest:point withEvent:event];
}
}
6、HitTest
1)將當前當前坐標系上的點轉(zhuǎn)換到指定坐標系上的點
2)判斷點不在目標坐標系上
3)如果點在目標坐標系上讶踪,且目標坐標系內(nèi)存在多個控件芯侥,需要調(diào)用坐標的HitTest
找到最合適的控件;如果找不到這個更合適的View(或者沒有子控件乳讥,因為只有自己)就返回自己柱查,作為最終的事件接收者
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
//1、當按鈕超出父控件的范圍雏婶,使其可以響應(yīng)事件
//1.1 將父控件相應(yīng)點物赶,轉(zhuǎn)換到按鈕內(nèi)部坐標系
CGPoint cartButtonPoint = [self convertPoint:point toView:self.cartButton];
//1.2 判斷轉(zhuǎn)換后的點是否在按鈕上
if ([self.cartButton pointInside:cartButtonPoint withEvent:event])
{
//1.3 轉(zhuǎn)換后的點在按鈕上,且按鈕沒有子控件可以遍歷留晚,返回按鈕本身
return self.cartButton;
}
//2酵紫、當UITableView超出父控件的范圍告嘲,使其可以響應(yīng)事件
//2.1 將父控件相應(yīng)點,轉(zhuǎn)換到UITableView內(nèi)部坐標系
CGPoint goodsListViewPoint = [self convertPoint:point toView:self.goodsListView];
//2.2 判斷轉(zhuǎn)換后的點是否在UITableView上
if ([self.goodsListView pointInside:goodsListViewPoint withEvent:event])
{
//2.3 轉(zhuǎn)換后的點在UITableView上奖地,且存在子控件橄唬,所以調(diào)用HitTest方法查找最合適的View響應(yīng)事件
UIView *subView = [self.goodsListView hitTest:goodsListViewPoint withEvent:event];
//2.3 如果找到更合適的View返回即可,如果沒有返回UITableView自響應(yīng)事件
return subView ? subView : self.goodsListView;
}
//3参歹、 其余沒有特殊處理的子控件調(diào)用父類的HitTest方法找到最合適的View來響應(yīng)事件
return [super hitTest:point withEvent:event];
}
6仰楚、在使用AFnetwotking的時候,報錯提示一堆的二進制流數(shù)據(jù)并且以“text/html”結(jié)束犬庇,問題基本就在于你們服務(wù)端返回的二進制流的解析格式(text/html)不是常用的json僧界,xml等,需要手動修改afnetworking源碼臭挽,在框架內(nèi)查找“text/json”字符串并參照添加不能解析的格式串“text/html”在后面捂襟,即可,記得要全部添加
7欢峰、在使用iOS原生掃碼的時候奔潰在self.output.metadataObjectTypes(設(shè)置掃碼類型)
葬荷,通常是權(quán)限為題。
8纽帖、設(shè)置標題欄
如果要同時改變導(dǎo)航欄標題和UITabBar對應(yīng)的標題宠漩,使用self.title
如果單獨改變導(dǎo)航欄標題建議使用self.navigationItem.title
如果導(dǎo)航控制器和UITabBarController都自定義了,建議使用self.navigationItem.title
最后懊直,建議盡量使用self.navigationItem.title
設(shè)置標題扒吁。在沒有特殊需要,我們盡量不需要遷一發(fā)動全身的代碼吹截,也是遵循低耦合的編碼規(guī)范
9瘦陈、UICollectionView cellForItematIndexpath返回為nil
在reloadData后調(diào)用 layoutIfNeeded
[collectionView reloadData];
[collectionView layoutIfNeeded];
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y > 200 - 64) {
CGFloat x = scrollView.contentOffset.x;
scrollView.contentOffset = CGPointMake(x, 200 - 64);
self.v.alpha = 1.0;
}
else if ((scrollView.contentOffset.y < 200 - 64))
{
if (scrollView.contentOffset.y > 0)
{
CGFloat alpha = (1.0 / (200 - 64)) * scrollView.contentOffset.y;
NSLog(@"%f==%f",alpha,scrollView.contentOffset.y);
self.v.alpha = alpha;
}
else
{
self.v.alpha = 0;
}
}
}
10、字典setValue
value值為空波俄,導(dǎo)致奔潰
給NSMutableDictionary
添加一個分類實現(xiàn)setValue: forUndefinedKey:
方法
#import "NSMutableDictionary+ValueForNil.h"
@implementation NSMutableDictionary (ValueForNil)
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
}
@end
11晨逝、@dynamic和@synthesize
1、@dynamic 屬性名稱;//表示屬性的setter和getter方法將會動態(tài)添加懦铺,不用手動實現(xiàn)
2捉貌、@synthesize 屬性名稱;//表示屬性的setter和getter方法由編譯器合成,(使用@property關(guān)鍵字的默認實現(xiàn)冬念,不用顯示的告知編譯器)
3趁窃、在category中使用@property關(guān)鍵字編譯器是不能自動合成setter和getter方法的,而且編譯器不允許顯示的使用@synthesize來合成setter和getter方法急前,因為category中的@property關(guān)鍵字并不生成默認的下劃線成員變量醒陆,沒有辦法合成。
4裆针、在category添加的屬性是動態(tài)添加的刨摩,setter和getter方法頁需要我們動態(tài)添加可以直接實現(xiàn)setXXX:和xxx方法寺晌,也可以使用class_addMethod來動態(tài)添加(推薦使用,可以減少不必要的重復(fù)代碼澡刹,使用此方法呻征,通常會配合dynamic關(guān)鍵字,以消除警告)
12罢浇、swift的xib在iOS8系統(tǒng)下的使用
在iOS8系統(tǒng)下使用xib的時候要格外小心陆赋,通常我們無論控制器是xib
還是純代碼只需要使通用的()創(chuàng)建控制器,但是iOS顛覆了這一切嚷闭,如
果控制器使用xib攒岛,必須使用xxx(nibName: "", bundle: nil),否則xib
中的所有控件是不會創(chuàng)建胞锰,初始化的阵子,如果過此時你將xib中的控件連
線到控制器的class中(默認的xib的連線屬性都是!強解包的),就會報option變量強解包失敗而奔潰
13胜蛉、iOS和JSON串轉(zhuǎn)換
無論OC還是swift不要使用NSJSONWritingPrettyPrinted會帶有回車,服務(wù)器無法解析
//OC版
NSArray *params = @[@{@"name":@"小史",@"age":@"80"},
@{@"name":@"小史",@"age":@"80"},
@{@"name":@"小史",@"age":@"80"}];
NSData *data = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
//Swift版
let data = try? JSONSerialization.data(withJSONObject: params!, options: [])
jsonString = String.init(data: data!, encoding: String.Encoding.utf8) ?? jsonString
print(jsonString)
14色乾、線程保命使用Runloop
而不是strong
強引用
線程保命不能使用strong
強引用誊册,線程一旦task
結(jié)束就會自動回收,指向線程的指針就會成為野指針暖璧,如果使用強引用指針去保命案怯,在線程結(jié)束后去用強引用的指針去使用線程,直接野指針crash
澎办,線程保命應(yīng)該使用Runloop嘲碱,可以參見AFNetworking中的異步實現(xiàn)潘飘,如果給線程保命诚欠,那么AFNetworking的異步回調(diào)將不可能回調(diào)碘梢,因為在一步回調(diào)之前舵抹,線程已經(jīng)結(jié)束柑土,線程結(jié)束線程中所有的task
將不會再被執(zhí)行
15季惯、關(guān)閉隱式動畫
對非Root Layer的部分屬性進行修改時眠屎,默認會自動產(chǎn)生一些動畫效果音同,而這些屬性稱為Animatable
CATransaction.begin()
CATransaction.setDisableActions(true)
//圖層CALayer操作
CATransaction.commit()
16千扶、可變參數(shù)傳遞解析
1料祠、可變參數(shù)傳遞使用
...
,注意在方法聲明后添加宏NS_REQUIRES_NIL_TERMINATION(數(shù)組的創(chuàng)建等等就會用到)
澎羞,表示方法調(diào)用已nil
結(jié)束髓绽,因為可變參數(shù)的接收會用到C語言結(jié)構(gòu)的遍歷,已nil
結(jié)束幫助遍歷結(jié)束
2妆绞、安全考慮指針操作顺呕,va_start(不包含啟始元素)
和va_end
成對出現(xiàn)
3枫攀、可變參數(shù)接收的數(shù)據(jù)結(jié)構(gòu)是一個棧,va_arg
指針將移動到下一個參數(shù)塘匣,上一個參數(shù)出棧
參考文檔:
blog.csdn.net/grozy_sun/article/details/27634575?utm_source=tuicool
//聲明
- (void)test:(id)arg1,...NS_REQUIRES_NIL_TERMINATION;
//實現(xiàn)
- (void)test:(id)arg1,...
{
va_list args;
va_start(args, arg1);
if (arg1)
{
id otherArg = nil;
NSLog(@"%@",arg1);
while (1)
{
otherArg = va_arg(args, id);
if (otherArg == nil)
{
break;
}
NSLog(@"%@",otherArg);
}
va_end(args);
}
}
17脓豪、隱藏導(dǎo)航欄,但是保留側(cè)滑
//保留側(cè)滑
self.navigationController.navigationBar.hidden = YES;
//不保留側(cè)滑
self.navigationController.navigationBarHidden = YES;
18忌卤、使用快速構(gòu)建數(shù)組的方法構(gòu)建數(shù)組扫夜,必須確保數(shù)組的元素非空,非直接創(chuàng)建的數(shù)組最好不要使用快速構(gòu)建的方法
19驰徊、微信授權(quán)
微信授權(quán)在sdk中有直接的接口笤闯,其實就是授權(quán)登錄,授權(quán)的之前必須
20棍厂、pathforresource返回路徑為nil
json颗味,等一些資源文件需要在Build Phaeses->Copy Bundle Resource進行手動添加
21、UIImage旋轉(zhuǎn)顯示
self.idCardFrontImageView.image = [UIImage
imageWithCGImage:image.CGImage scale:1.0
orientation:UIImageOrientationLeft];
22牺弹、%和&
當集合容量是2的n次冪的時候浦马,計算元素在集合的位置的時候
集合編號 % 集合容量 <=> 集合編號 & (集合容量 - 1)
未完待續(xù)。张漂。晶默。