幾個(gè)iOS開發(fā)的小tips

clipsToBounds vs masksToBounds

clipsToBounds

clipsToBounds 決定子視圖的顯示范圍:設(shè)置為YES時(shí),子視圖超出部分將被剪裁碉纳,不會顯示适室;設(shè)置為NO則不會剪裁嫡意。
clipsToBounds的默認(rèn)值為NO,但是在UIScrollview中為YES捣辆。

比如view2添加到view1上蔬螟,即view2為view1的subview。

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 150, 100, 100)];
view1.backgroundColor = [UIColor blueColor];
[self.view addSubview:view1];
    
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
view2.backgroundColor = [UIColor redColor];
[view1 addSubview:view2];

view1的clipsToBounds設(shè)置為NO時(shí)汽畴,view2超出view1的部分將不會剪裁旧巾,如圖左耸序,紅色部分不會被剪裁。

view1.clipsToBounds = NO;

view1的clipsToBounds設(shè)置為YES時(shí)菠齿,view2超出view1的部分將會被剪裁佑吝,如圖右,紅色部分被剪掉了绳匀。

view1.clipsToBounds = YES;
clipsToBounds

在Apple的Prefetching Collection View Data 示例代碼中就是將UICollectionView 的 clipsToBounds 設(shè)置為 NO以顯示 cell 超出 UICollectionView 時(shí)的狀態(tài)芋忿,來觀察UICollectionViewCell的生命周期。

masksToBounds

masksToBounds的功能和clipsToBounds類似疾棵,但是clipsToBounds是CALayer的屬性戈钢,clipsToBounds是UIView新的屬性,clipsToBounds會調(diào)用maskToBounds方法是尔。

通常使用在設(shè)置cornerRadius不能達(dá)到圓角效果的控件上殉了,如UIImageView、UILabel等拟枚。

imageView.layer.cornerRadius = 5.f;
imageView.layer.masksToBounds = YES;

需要注意薪铜,設(shè)置maskToBounds = YES可能會觸發(fā)離屏渲染。關(guān)于可參考關(guān)于iOS離屏渲染的深入研究恩溅。

UITextField && UITextView 輸入限制

限制文本輸入可以監(jiān)聽UIKeyboardWillChangeFrameNotification通知隔箍,在其中判斷文字長度。但需要注意的是:不要把高亮的部分脚乡,即聯(lián)想輸入的部分記入到字?jǐn)?shù)統(tǒng)計(jì)中蜒滩,因?yàn)檫@部分不是我們真正要輸入的內(nèi)容。比如在中文情況下奶稠,輸入拼音時(shí)俯艰,還沒有選中文字就會被鍵盤當(dāng)作字母輸入到UITextField/UITextView中,比如可輸入字符還剩下1個(gè)锌订,此時(shí)想打一個(gè)“吃”字竹握,輸入拼音“chi”,則會將計(jì)算的是“chi”三個(gè)字符的長度辆飘。

- (void)textViewDidChange:(UITextView *)textView {
    if (textView.text.length > self.maxInputWords && !textView.markedTextRange) { // 防止把高亮的部分計(jì)入
        textView.text = [textView.text substringToIndex:self.maxInputWords];
    }
    // 顯示已經(jīng)輸入文字個(gè)數(shù)
    self.wordsLabel.text = [NSString stringWithFormat:@"%lu/%ld", (long)textView.text.length, (long)self.maxInputWords];
}

UITextView return鍵隱藏鍵盤

UITextView 不像 UITextfield 一樣提供了 textFieldShouldReturn:方法實(shí)現(xiàn)涩搓,可以通過 UITextViewDelegate 中的textView:shouldChangeTextInRange:replacementText代理方法實(shí)現(xiàn):

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"]){ // 判斷輸入的字是否是回車,即按下 return
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}

UISwitch 開關(guān)保持原來的狀態(tài)

UISwitch在點(diǎn)擊時(shí)狀態(tài)即會改變劈猪,如果想讓它點(diǎn)擊時(shí)不馬上改變狀態(tài),而是進(jìn)行其他操作之后再響應(yīng)良拼,可以在UISwitch的target方法中這樣操作:

[switch addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];

- (void)switchAction:(UISwitch *)sender {
        // 讓開關(guān)狀態(tài)不變
        [sender setOn:!sender.on animated:YES];

        // 其他操作...

        // 修改開關(guān)狀態(tài)
        sender.on = ...;
}

注意:是把a(bǔ)nimated設(shè)置為YES战得。原因推測可能是animated有延時(shí)。

UITableView 單選多選實(shí)現(xiàn)

UITableview提供了單選和多選機(jī)制庸推,分別是allowsSelectionallowsMultipleSelection屬性常侦,但是當(dāng)你想要在一個(gè)TabelView的不同section中分別使用單選和多選(比如第一個(gè)section支持單選浇冰,第二個(gè) section 支持多選)就需要自己實(shí)現(xiàn)了。在 section 不多的情況下聋亡,這里提供一種快速的方案:讓 UITableview 開啟多選肘习,即allowsMultipleSelection=YES,用變量記錄單選section中上一次選中的行坡倔,在tableView:didSelectRowAtIndexPath中進(jìn)行判斷漂佩,如果選擇的是不同行,則取消上一次選中罪塔。

self.tableView.allowsMultipleSelection = YES; // 允許多選

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    BBASuggestFeedbackHeaderModel *headerModel;

    if (indexPath.section == 0) {
         // 取消上一次選中
         if (self.lastSelectedIndex != indexPath.row) { // 點(diǎn)擊同一個(gè)不做處理
              NSIndexPath *lastIndex = [NSIndexPath indexPathForRow:self.lastSelectedIndex inSection:indexPath.section];
              [tableView deselectRowAtIndexPath:lastIndex animated:YES];
              self.lastSelectedIndex = indexPath.row;
         }
    }
}

獲取選中狀態(tài)的cell投蝉,即可通過indexPathsForSelectedRows獲取。

UICollectionViewCell 高亮和點(diǎn)擊態(tài)

UICollectionView不像UITableView一樣默認(rèn)有高亮狀態(tài)征堪,可以通過設(shè)置 UICollectionViewCell 的selectedBackgroundView實(shí)現(xiàn)瘩缆。并且UICollectionView也提供幾個(gè)高亮的代理方法

  • collectionView:shouldHighlightItemAtIndexPath:
  • collectionView:didHighlightItemAtIndexPath:
  • collectionView:didUnhighlightItemAtIndexPath:

但是如果這個(gè)時(shí)候的需求是需要在高亮的時(shí)候讓cell上的其他子控件也改變alph值,單純的設(shè)置selectedBackgroundView的不能滿足佃蚜。
可以通過重寫Cell的兩個(gè)方法setHighlighted:setSelected:庸娱,

  • setHighlighted: 高亮狀態(tài),即按在cell上不松開的效果
  • setSelected: 選中狀態(tài)谐算,點(diǎn)擊一個(gè)cell即選中
 - (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    
    if (highlighted) {
        // 高亮狀態(tài)下的子控件顏色設(shè)置
    } else {
        // 普通狀態(tài)的子控件顏色設(shè)置
    }
}

 - (void)setSelected:(BOOL)selected {
    [super setSelected:selected];

    if (selected) {
        // 高亮狀態(tài)下的子控件顏色設(shè)置
    } else {
        // 普通狀態(tài)的子控件顏色設(shè)置
    }
}

Cell上UIImageView的圖片不顯示

如果cell上的UIImageView在不同情況下會size不同熟尉,圓角不同,cell復(fù)用是需要更新UIImageView的約束氯夷。遇到UIImageView中圖片不顯示的情況臣樱,可以從以下幾個(gè)方面排查:

  • imageView 的 frame 是否設(shè)置正確,比如采用initWithImage:方法初始化時(shí)腮考,會根據(jù)圖片的大小來設(shè)置imageView的frame可以不用初始化尺寸雇毫,但是大小不可控。
  • image view 的 hidden 是否設(shè)置
  • 是否添加到父 view 上
  • 是否設(shè)置 imageView 的 image
  • imageView 的 image 是否是從網(wǎng)絡(luò)獲取的踩蔚,是否采用占位圖片
  • imageView是否在設(shè)置圓角棚放,圓角是否過大,比如ImageView的size為20 * 20馅闽,而圓角大小為40飘蚯,則不會顯示。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末福也,一起剝皮案震驚了整個(gè)濱河市局骤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暴凑,老刑警劉巖峦甩,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異现喳,居然都是意外死亡凯傲,警方通過查閱死者的電腦和手機(jī)犬辰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冰单,“玉大人幌缝,你說我怎么就攤上這事〗肭罚” “怎么了涵卵?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呕诉。 經(jīng)常有香客問我缘厢,道長,這世上最難降的妖魔是什么甩挫? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任贴硫,我火速辦了婚禮,結(jié)果婚禮上伊者,老公的妹妹穿的比我還像新娘英遭。我一直安慰自己,他們只是感情好亦渗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布挖诸。 她就那樣靜靜地躺著,像睡著了一般法精。 火紅的嫁衣襯著肌膚如雪多律。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天搂蜓,我揣著相機(jī)與錄音狼荞,去河邊找鬼。 笑死帮碰,一個(gè)胖子當(dāng)著我的面吹牛相味,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殉挽,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丰涉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斯碌?” 一聲冷哼從身側(cè)響起一死,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傻唾,沒想到半個(gè)月后摘符,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年逛裤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猴抹。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡带族,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟀给,到底是詐尸還是另有隱情蝙砌,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布跋理,位于F島的核電站择克,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏前普。R本人自食惡果不足惜肚邢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拭卿。 院中可真熱鬧骡湖,春花似錦、人聲如沸峻厚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惠桃。三九已至浦夷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辜王,已是汗流浹背劈狐。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誓禁,地道東北人懈息。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像摹恰,于是被迫代替她去往敵國和親辫继。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354