幾個iOS開發的小tips

clipsToBounds vs masksToBounds

clipsToBounds

clipsToBounds 決定子視圖的顯示範圍:設置爲YES時,子視圖超出部分將被剪裁,不會顯示;設置爲NO則不會剪裁。 clipsToBounds的默認值爲NO,可是在UIScrollview中爲YES。bash

好比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設置爲NO時,view2超出view1的部分將不會剪裁,如圖左,紅色部分不會被剪裁。app

view1.clipsToBounds = NO;
複製代碼

view1的clipsToBounds設置爲YES時,view2超出view1的部分將會被剪裁,如圖右,紅色部分被剪掉了。fetch

view1.clipsToBounds = YES;
複製代碼

clipsToBounds

在Apple的Prefetching Collection View Data 示例代碼中就是將UICollectionView 的 clipsToBounds 設置爲 NO以顯示 cell 超出 UICollectionView 時的狀態,來觀察UICollectionViewCell的生命週期。ui

masksToBounds

masksToBounds的功能和clipsToBounds相似,可是clipsToBounds是CALayer的屬性,clipsToBounds是UIView新的屬性,clipsToBounds會調用maskToBounds方法。spa

一般使用在設置cornerRadius不能達到圓角效果的控件上,如UIImageView、UILabel等。代理

imageView.layer.cornerRadius = 5.f;
imageView.layer.masksToBounds = YES;
複製代碼

須要注意,設置maskToBounds = YES可能會觸發離屏渲染。關於可參考關於iOS離屏渲染的深刻研究code

UITextField && UITextView 輸入限制

限制文本輸入能夠監聽UIKeyboardWillChangeFrameNotification通知,在其中判斷文字長度。但須要注意的是:不要把高亮的部分,即聯想輸入的部分記入到字數統計中,由於這部分不是咱們真正要輸入的內容。好比在中文狀況下,輸入拼音時,尚未選中文字就會被鍵盤看成字母輸入到UITextField/UITextView中,好比可輸入字符還剩下1個,此時想打一個「吃」字,輸入拼音「chi」,則會將計算的是「chi」三個字符的長度。orm

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

UITextView return鍵隱藏鍵盤

UITextView 不像 UITextfield 同樣提供了 textFieldShouldReturn:方法實現,能夠經過 UITextViewDelegate 中的textView:shouldChangeTextInRange:replacementText代理方法實現:cdn

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

UISwitch 開關保持原來的狀態

UISwitch在點擊時狀態即會改變,若是想讓它點擊時不立刻改變狀態,而是進行其餘操做以後再響應,能夠在UISwitch的target方法中這樣操做:

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

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

		// 其餘操做...

		// 修改開關狀態
		sender.on = ...;
}
複製代碼

注意:是把animated設置爲YES。緣由推測多是animated有延時。

UITableView 單選多選實現

UITableview提供了單選和多選機制,分別是allowsSelectionallowsMultipleSelection屬性,可是當你想要在一個TabelView的不一樣section中分別使用單選和多選(好比第一個section支持單選,第二個 section 支持多選)就須要本身實現了。在 section 很少的狀況下,這裏提供一種快速的方案:讓 UITableview 開啓多選,即allowsMultipleSelection=YES,用變量記錄單選section中上一次選中的行,在tableView:didSelectRowAtIndexPath中進行判斷,若是選擇的是不一樣行,則取消上一次選中。

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

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

    if (indexPath.section == 0) {
         // 取消上一次選中
         if (self.lastSelectedIndex != indexPath.row) { // 點擊同一個不作處理
              NSIndexPath *lastIndex = [NSIndexPath indexPathForRow:self.lastSelectedIndex inSection:indexPath.section];
              [tableView deselectRowAtIndexPath:lastIndex animated:YES];
              self.lastSelectedIndex = indexPath.row;
         }
    }
}
複製代碼

獲取選中狀態的cell,便可經過indexPathsForSelectedRows獲取。

UICollectionViewCell 高亮和點擊態

UICollectionView不像UITableView同樣默認有高亮狀態,能夠經過設置 UICollectionViewCell 的selectedBackgroundView實現。而且UICollectionView也提供幾個高亮的代理方法

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

可是若是這個時候的需求是須要在高亮的時候讓cell上的其餘子控件也改變alph值,單純的設置selectedBackgroundView的不能知足。 能夠經過重寫Cell的兩個方法setHighlighted:setSelected:

  • setHighlighted: 高亮狀態,即按在cell上不鬆開的效果
  • setSelected: 選中狀態,點擊一個cell即選中
- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    
    if (highlighted) {
    	// 高亮狀態下的子控件顏色設置
    } else {
    	// 普通狀態的子控件顏色設置
    }
}

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

    if (selected) {
   	 	// 高亮狀態下的子控件顏色設置
    } else {
		// 普通狀態的子控件顏色設置
    }
}
複製代碼

Cell上UIImageView的圖片不顯示

若是cell上的UIImageView在不一樣狀況下會size不一樣,圓角不一樣,cell複用是須要更新UIImageView的約束。遇到UIImageView中圖片不顯示的狀況,能夠從如下幾個方面排查:

  • imageView 的 frame 是否設置正確,好比採用initWithImage:方法初始化時,會根據圖片的大小來設置imageView的frame能夠不用初始化尺寸,可是大小不可控。
  • image view 的 hidden 是否設置
  • 是否添加到父 view 上
  • 是否設置 imageView 的 image
  • imageView 的 image 是不是從網絡獲取的,是否採用佔位圖片
  • imageView是否在設置圓角,圓角是否過大,好比ImageView的size爲20 * 20,而圓角大小爲40,則不會顯示。
相關文章
相關標籤/搜索