iOS小技巧

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
![Uploading Snip20160225_6_823671.png . . .]
新特性拉伸操作方法2
Snip20160225_6.png

3跳纳、修改背景alph值而不影響子控件的alph,子控件不繼承父控件的alph值

有時候我們需要修改控件的背景透明度贪嫂,但是子控件默認
回繼承父控件的透明度屬性寺庄,此時可以這樣干
self.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.1];

4、解決導(dǎo)航欄的標題不居中

//當導(dǎo)航欄的標題不居中力崇,在上一頁消失的時候?qū)祟}設(shè)為nil即可

5斗塘、坐標系轉(zhuǎn)換

convertRectconvertPoint作為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、字典setValuevalue值為空波俄,導(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)鍵字,以消除警告)

動態(tài)添加屬性.png

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ù)。张漂。晶默。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市航攒,隨后出現(xiàn)的幾起案子磺陡,更是在濱河造成了極大的恐慌,老刑警劉巖漠畜,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件币他,死亡現(xiàn)場離奇詭異,居然都是意外死亡憔狞,警方通過查閱死者的電腦和手機蝴悉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躯喇,“玉大人辫封,你說我怎么就攤上這事×觯” “怎么了倦微?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長正压。 經(jīng)常有香客問我欣福,道長,這世上最難降的妖魔是什么焦履? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任拓劝,我火速辦了婚禮雏逾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郑临。我一直安慰自己栖博,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布厢洞。 她就那樣靜靜地躺著仇让,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躺翻。 梳的紋絲不亂的頭發(fā)上丧叽,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音公你,去河邊找鬼踊淳。 笑死,一個胖子當著我的面吹牛陕靠,可吹牛的內(nèi)容都是我干的迂尝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼剪芥,長吁一口氣:“原來是場噩夢啊……” “哼雹舀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粗俱,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虚吟,沒想到半個月后寸认,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡串慰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年偏塞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邦鲫。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡灸叼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庆捺,到底是詐尸還是另有隱情古今,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布滔以,位于F島的核電站捉腥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏你画。R本人自食惡果不足惜抵碟,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一桃漾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拟逮,春花似錦撬统、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颅崩,卻和暖如春几于,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沿后。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工沿彭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尖滚。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓喉刘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漆弄。 傳聞我的和親對象是個殘疾皇子睦裳,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,288評論 25 707
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,163評論 30 470
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,359評論 0 35
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理撼唾。運行時機制的原理和運用場景廉邑。SDWebImage的原...
    LZM輪回閱讀 2,009評論 0 12
  • 讀完自控力給我最大的感受就是當你想做成做好一件事情的時候。首先倒谷,從一個點開始蛛蒙,先有量變再到質(zhì)變。然后就是道倒...
    ailit閱讀 465評論 0 0