以下都是自己在iOS開(kāi)發(fā)的過(guò)程中遇到的問(wèn)題,自己總結(jié)出來(lái)的小知識(shí)點(diǎn)魄眉。
1.UITableViewCell的contenView的superView在iOS8以上是UITableViewCell恃泪,在iOS8以下則不是队腐。所以訪問(wèn)contentView的superView的時(shí)候需要注意區(qū)分iOS系統(tǒng)版本。
2.程序中一個(gè)UITabBarController控制了四個(gè)UINavigationController,在某個(gè)頁(yè)面上點(diǎn)擊按鈕要讓tabbar選中某一個(gè)baritem薪前,需要先設(shè)置tabbar的selectedIndex再將當(dāng)前的nav popToRootViewController润努。順序相反會(huì)導(dǎo)致tabbar隱藏。
3.在某個(gè)界面上有個(gè)UITableView示括,需要在滑動(dòng)的時(shí)候改變另外一個(gè)UIView铺浇,所以在代碼中添加了如下代理方法:
-(void)scrollViewDidScroll:(UIScrollView*)scrollView
實(shí)現(xiàn)了需求。但是如果當(dāng)UITableView正在滑動(dòng)的時(shí)候pop了當(dāng)前視圖垛膝,程序會(huì)奔潰鳍侣。
原因:想已經(jīng)釋放的對(duì)象發(fā)送了消息。吼拥。倚聚。。
就是在返回之后凿可,當(dāng)前視圖對(duì)象釋放了惑折,但是又調(diào)用了委托方法。
應(yīng)該在dealloc方法中將UITableView的委托設(shè)置為nil,避免UITableView正在滑動(dòng)的時(shí)候返回會(huì)奔潰惨驶。
-(void)dealloc
{
tableView.delegate = nil;
tableView.dataSource = nil;
//這里要注意白热,如果項(xiàng)目使用了arc的話,不要調(diào)用super dealloc方法粗卜。
}
4.十進(jìn)制數(shù)轉(zhuǎn)十六進(jìn)制數(shù)的命令:
echo 'obase=16;1104129754’|bc ? 其中1104129754是十進(jìn)制數(shù)
這個(gè)在分享功能中添加URL Scheme的時(shí)候有需要屋确。
5.UITableViewCell自動(dòng)布局,在cell的最下面自己用UILbel加一個(gè)橫線休建。那么添加約束的時(shí)候乍恐,這個(gè)UILabel的寬度要添加跟self的寬度一樣。因?yàn)槿绻鹀ell設(shè)置了cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;并且添加UILabel的寬度跟self.contentView的寬度一樣的話测砂,就會(huì)出現(xiàn)這個(gè)UILabel的右邊緣到cell上面的向右的箭頭的位置就結(jié)束了茵烈。這說(shuō)明contentView的右邊界是到向右箭頭的左邊為止的。
像這樣的:
6.在自動(dòng)布局的UITableViewCell向下復(fù)現(xiàn)的時(shí)候(即UITableView向下滾動(dòng)的時(shí)候砌些,已經(jīng)出現(xiàn)過(guò)的Cell重現(xiàn)出現(xiàn)呜投。)帶有一跳一跳的效果。檢查發(fā)現(xiàn)是因?yàn)樵O(shè)置tableView.estimatedRowHeight=40;導(dǎo)致的存璃。因?yàn)槲疫@里有兩個(gè)高度不同的cell仑荐,一個(gè)高度是10(作為分隔線的),一個(gè)高度根據(jù)自適應(yīng)計(jì)算的纵东。如果設(shè)置了預(yù)估高度的話粘招,高度本來(lái)應(yīng)該為10的cell出現(xiàn)的時(shí)候會(huì)先設(shè)置為40然后又變?yōu)?0,這就導(dǎo)致了跳動(dòng)效果偎球。
因此洒扎,當(dāng)UITableView有多個(gè)不同高度的UITableViewCell的時(shí)候,不應(yīng)該設(shè)置UITableView的estimatedRowHeight屬性來(lái)只設(shè)置一個(gè)預(yù)估高度值衰絮。否則會(huì)導(dǎo)致UITableView向下滑動(dòng)袍冷,UITableViewCell復(fù)現(xiàn)的時(shí)候有一跳一跳的效果。
不過(guò)可以通過(guò)委托方法- (CGFloat)tableView:(UITableView*)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath*)indexPath來(lái)設(shè)置不同樣式的UITableViewCell的預(yù)估高度猫牡。
7.自動(dòng)布局中多行UILabel胡诗,需要設(shè)置其preferredMaxLayoutWidth屬性才能正常顯示多行內(nèi)容。
8.可以使用NSArray或者NSSet的
-?(void)makeObjectsPerformSelector:(SEL)aSelector;
-?(void)makeObjectsPerformSelector:(SEL)aSelectorwithObject:(id)argument;
這兩個(gè)相當(dāng)于for循環(huán)的方法來(lái)依次讓NSArray或者NSSet中的對(duì)象執(zhí)行aSelector方法淌友。
9.給手勢(shì)添加新的目標(biāo)對(duì)象和方法:
- (void)addTarget:(id)target action:(SEL)action
在當(dāng)前視圖上面添加了一個(gè)自定義的菜單視圖menu煌恢,menu上面添加了一個(gè)單擊手勢(shì)UITapGestureRecognizer(不是menu的公開(kāi)屬性)來(lái)展開(kāi)和收起菜單,具體事件是寫在menu里面的.
現(xiàn)在當(dāng)前視圖上面有文本框震庭,需求是在不改動(dòng)menu的前提下症虑,點(diǎn)擊菜單的時(shí)候,釋放鍵盤归薛。
想過(guò)給menu新添加一個(gè)UITapGestureRecognizer手勢(shì)來(lái)解決這個(gè)問(wèn)題谍憔,但是想想它既然已經(jīng)有了一個(gè)單擊手勢(shì)匪蝙,何必再新添加一個(gè)呢。經(jīng)查閱文檔习贫,發(fā)現(xiàn)有這么個(gè)解決方案:
NSArray*gestureArray = menu.gestureRecognizers;
for(UIGestureRecognizer*gestureingestureArray)
{
? ?if([gestureisKindOfClass:[UITapGestureRecognizerclass]])
? ?{
? ? ? ?UITapGestureRecognizer*tapGesture = (UITapGestureRecognizer*)gesture;
? ? ? ? [tapGestureaddTarget:selfaction:@selector(menuTaped)];
? ? ? ? ?break;
? ?}
}
在當(dāng)前視圖中獲取自己創(chuàng)建的這個(gè)menu上面添加的UITapGestureRecognizer手勢(shì)逛球,然后給它新增一個(gè)目標(biāo)對(duì)象和方法,在方法中處理釋放鍵盤的邏輯苫昌。
10.設(shè)置導(dǎo)航的返回按鈕標(biāo)題需求:只顯示返回圖標(biāo)颤绕,不顯示返回按鈕的標(biāo)題
//!!!!:設(shè)置導(dǎo)航返回按鈕文字的正確姿勢(shì)!
UIBarButtonItem*item = [[UIBarButtonItemalloc]initWithTitle:@""style:UIBarButtonItemStylePlaintarget:nilaction:nil];
self.navigationItem.backBarButtonItem= item;
網(wǎng)上有人說(shuō)可以用下面的方法祟身,但是實(shí)踐發(fā)現(xiàn)下面這種方法在VC的標(biāo)題很短的時(shí)候不會(huì)出現(xiàn)問(wèn)題奥务,一旦標(biāo)題變長(zhǎng),這種方法會(huì)導(dǎo)致標(biāo)題向右偏移袜硫,看起來(lái)很不好氯葬。。婉陷。帚称。
[[UIBarButtonItemappearance]setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
偏移效果如下:
11.頁(yè)面下拉刷新箭頭有時(shí)候在加載過(guò)程中push進(jìn)新頁(yè)面然后再返回的時(shí)候收不起來(lái)的問(wèn)題
self.edgesForExtendedLayout=UIRectEdgeNone;是因?yàn)閟elf.view addSubView:添加的第一個(gè)子視圖不是UIScrollView的子類,而沒(méi)有設(shè)置這個(gè)導(dǎo)致的秽澳。
12.在當(dāng)前頁(yè)面A中有一個(gè)UITextField文本框闯睹,并添加了UITextFieldTextDidChangeNotification通告,當(dāng)文本框內(nèi)容改變時(shí)進(jìn)行動(dòng)態(tài)搜索匹配担神,在收到通知之后改變這個(gè)文本框的內(nèi)容楼吃。但是,如果現(xiàn)在push進(jìn)來(lái)了一個(gè)新的帶有文本框的頁(yè)面B妄讯,當(dāng)在B中文本框內(nèi)輸入內(nèi)容之后再返回A孩锡,這時(shí)候發(fā)現(xiàn)A中的文本框的內(nèi)容是B中文本框所填的內(nèi)容。
這是因?yàn)橥ǜ娴膯?wèn)題捞挥,在監(jiān)聽(tīng)通告的地方?jīng)]有判斷是不是當(dāng)前A中的文本框觸發(fā)的,只需在方法中判斷一下即可忧吟。
13.tabaritem的標(biāo)題默認(rèn)跟它對(duì)應(yīng)的nav的rootviewcontroller的self.title是一樣的砌函。如果要tbbaritem的文字跟self.title不一樣,可以在rootviewcontroller中設(shè)置self.naigationItem.title@“標(biāo)題”;而不是直接用self.title屬性溜族。
14.當(dāng)給一個(gè)UIImageView添加固定寬高約束讹俊,但是當(dāng)加載的網(wǎng)絡(luò)圖片比約束的寬高大很多的時(shí)候,顯示的圖片內(nèi)容會(huì)撐出UIImageView的邊界煌抒,設(shè)置了UIImageView的contentMode也不行仍劈。這個(gè)給UIImage添加一個(gè)Resize分類,并添加一個(gè)新的方法:
-(instancetype)resizeToSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[selfdrawInRect:CGRectMake(0,0, size.width, size.height)];
UIImage*newImage =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnnewImage;
}
對(duì)UIImageView的imag進(jìn)行重繪就不會(huì)出現(xiàn)這種情況了寡壮。
15.在自定義單元格上面贩疙,左邊一個(gè)UILabel右邊對(duì)齊顯示標(biāo)題讹弯,右邊一個(gè)UITextField供用戶輸入內(nèi)容。給UILabel添加了固定寬度約束这溅,給UITextFiled添加了邊距約束组民。但是當(dāng)UITextField中輸入內(nèi)容很長(zhǎng)的時(shí)候會(huì)發(fā)現(xiàn)UITextFiled會(huì)把左邊的UILabel擠壓到左邊(比如UILabel顯示的文字是@“姓名”給它加的寬度約束是100,但是實(shí)際顯示的時(shí)候會(huì)顯示到單元格的最左邊悲靴,只有剛剛好能顯示全@“姓名”的寬度臭胜,剩下的單元格寬度都給了UItextFiled。)這種效果不是我們想要的效果癞尚,我們想要UILabel固定寬度耸三。只需要將右邊的UITextField也添加一個(gè)寬度約束即可,添加lessThanOrEqualTo(這里加上cell的寬度減去左邊UILabel的寬度以及它們之間的間隔)這樣當(dāng)文本框輸入內(nèi)容很長(zhǎng)的時(shí)候就不會(huì)擠壓左邊的UILabel了浇揩。
16.獲取APP的Launch Image(from:里脊串的開(kāi)發(fā)隨筆)
CGSizeviewSize =self.window.bounds.size;
NSString*viewOrientation =@"Portrait";//橫屏請(qǐng)?jiān)O(shè)置成 @"Landscape"
NSString*launchImage =nil;
NSArray* imagesDict = [[[NSBundlemainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
for(NSDictionary* dictinimagesDict)
{
CGSizeimageSize =CGSizeFromString(dict[@"UILaunchImageSize"]);
if(CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
{
launchImage = dict[@"UILaunchImageName"];
}
}
17.Xcode Tip合集 (from:sunnyxx的博客)