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;
複製代碼
在Apple的Prefetching Collection View Data 示例代碼中就是將UICollectionView 的 clipsToBounds 設置爲 NO以顯示 cell 超出 UICollectionView 時的狀態,來觀察UICollectionViewCell的生命週期。ui
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
限制文本輸入能夠監聽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 不像 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的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提供了單選和多選機制,分別是allowsSelection
和allowsMultipleSelection
屬性,可是當你想要在一個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
獲取。
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在不一樣狀況下會size不一樣,圓角不一樣,cell複用是須要更新UIImageView的約束。遇到UIImageView中圖片不顯示的狀況,能夠從如下幾個方面排查:
initWithImage:
方法初始化時,會根據圖片的大小來設置imageView的frame能夠不用初始化尺寸,可是大小不可控。