一.UITextField屬性
0.????????enablesReturnKeyAutomatically
默認為No,如果設(shè)置為Yes,文本框中沒有輸入任何字符的話语盈,右下角的返回按鈕是disabled的帝嗡。
設(shè)置邊框樣式,只有設(shè)置了才會顯示邊框樣式
text.borderStyle =UITextBorderStyleRoundedRect;
typedef enum {
UITextBorderStyleNone,
UITextBorderStyleLine,
UITextBorderStyleBezel,
UITextBorderStyleRoundedRect
}UITextBorderStyle;
設(shè)置輸入框的背景顏色罢荡,此時設(shè)置為白色?如果使用了自定義的背景圖片邊框會被忽略掉
text.backgroundColor =[UIColor whiteColor];
設(shè)置背景
text.background = [UIImageimageNamed:@"dd.png"];//UITextField 的背景,注意只有UITextBorderStyleNone的時候改屬性有效
設(shè)置enable為no時吆玖,textfield的背景
text.disabledBackground = [UIImageimageNamed:@"cc.png"];
當輸入框沒有內(nèi)容時复局,?提示內(nèi)容為password
text.placeholder =@"password";
設(shè)置輸入框內(nèi)容的字體樣式和大小
text.font = [UIFontfontWithName:@"Arial" size:20.0f];
設(shè)置字體顏色
text.textColor = [UIColor redColor];
輸入框中是否有個叉號,在什么時候顯示晤柄,用于一次性刪除輸入框中的內(nèi)容
text.clearButtonMode = UITextFieldViewModeAlways;
typedef enum {
UITextFieldViewModeNever, 重不出現(xiàn)
UITextFieldViewModeWhileEditing,?編輯時出現(xiàn)
UITextFieldViewModeUnlessEditing, 除了編輯外都出現(xiàn)
UITextFieldViewModeAlways 一直出現(xiàn)
} UITextFieldViewMode;
輸入框中一開始就有的文字
text.text = @"一開始就在輸入框的文字";
每輸入一個字符就變成點?用來輸入密碼時擦剑,設(shè)置這個屬性。
text.secureTextEntry = YES;
是否糾錯
text.autocorrectionType =UITextAutocorrectionTypeNo;
typedef enum {
UITextAutocorrectionTypeDefault,?默認
UITextAutocorrectionTypeNo, 不自動糾錯
UITextAutocorrectionTypeYes, 自動糾錯
} UITextAutocorrectionType;
再次編輯就清空
text.clearsOnBeginEditing = YES;
內(nèi)容對齊方式
text.textAlignment =UITextAlignmentLeft;
內(nèi)容的垂直對齊方式? UITextField繼承自UIControl,此類中有一個屬性contentVerticalAlignment
text.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;
設(shè)置為YES時文本會自動縮小以適應(yīng)文本窗口大小.默認是保持原來大小,而讓長文本滾動
textFied.adjustsFontSizeToFitWidth =YES;
//設(shè)置自動縮小顯示的最小字體大小
text.minimumFontSize = 20;
設(shè)置鍵盤的樣式
text.keyboardType =UIKeyboardTypeNumberPad;
typedef enum {
UIKeyboardTypeDefault, ?? 默認鍵盤可免,支持所有字符
UIKeyboardTypeASCIICapable, 支持ASCII的默認鍵盤
UIKeyboardTypeNumbersAndPunctuation, 標準電話鍵盤抓于,支持+*#字符
UIKeyboardTypeURL,? ?? ? ? ? URL鍵盤做粤,支持.com按鈕?只支持URL字符
UIKeyboardTypeNumberPad,? ? ?? ? ? 數(shù)字鍵盤
UIKeyboardTypePhonePad, 電話鍵盤
UIKeyboardTypeNamePhonePad, 電話鍵盤浇借,也支持輸入人名
UIKeyboardTypeEmailAddress, 用于輸入電子?郵件地址的鍵盤
UIKeyboardTypeDecimalPad, ? 數(shù)字鍵盤?有數(shù)字和小數(shù)點
UIKeyboardTypeTwitter,?? ? 優(yōu)化的鍵盤,方便輸入@怕品、#字符
UIKeyboardTypeAlphabet =UIKeyboardTypeASCIICapable,
} UIKeyboardType;
首字母是否大寫
text.autocapitalizationType =UITextAutocapitalizationTypeNone;
typedef enum {
UITextAutocapitalizationTypeNone,?不自動大寫
UITextAutocapitalizationTypeWords, 單詞首字母大寫
UITextAutocapitalizationTypeSentences, 句子的首字母大寫
UITextAutocapitalizationTypeAllCharacters,?所有字母都大寫
} UITextAutocapitalizationType;
return鍵變成什么鍵
text.returnKeyType =UIReturnKeyDone;
typedef enum {
UIReturnKeyDefault,?默認?灰色按鈕妇垢,標有Return
UIReturnKeyGo,? ? 標有Go的藍色按鈕
UIReturnKeyGoogle,標有Google的藍色按鈕,用語搜索
UIReturnKeyJoin,標有Join的藍色按鈕
UIReturnKeyNext,標有Next的藍色按鈕
UIReturnKeyRoute,標有Route的藍色按鈕
UIReturnKeySearch,標有Search的藍色按鈕
UIReturnKeySend,標有Send的藍色按鈕
UIReturnKeyYahoo,標有Yahoo的藍色按鈕
UIReturnKeyYahoo,標有Yahoo的藍色按鈕
UIReturnKeyEmergencyCall,?緊急呼叫按鈕
} UIReturnKeyType;
鍵盤外觀
textView.keyboardAppearance=UIKeyboardAppearanceDefault肉康;
typedef enum {
UIKeyboardAppearanceDefault闯估,?默認外觀,淺灰色
UIKeyboardAppearanceAlert吼和, 深灰?石墨色
} UIReturnKeyType;
19. delegate
設(shè)置代理?用于實現(xiàn)協(xié)議
text.delegate = self;
最右側(cè)加圖片是以下代碼 ?左側(cè)類似
UIImageView*image=[[UIImageView alloc] initWithImage:[UIImageimageNamed:@"right.png"]];
text.rightView=image;
text.rightViewMode =UITextFieldViewModeAlways;
typedef enum {
UITextFieldViewModeNever,
UITextFieldViewModeWhileEditing,
UITextFieldViewModeUnlessEditing,
UITextFieldViewModeAlways
} UITextFieldViewMode;
是否允許編輯涨薪。
除了UITextField對象的風格選項,你還可以定制化UITextField對象炫乓,為他添加許多不同的重寫方法刚夺,來改變文本字段的顯示行為。這些方法都會返回一個CGRect結(jié)構(gòu)末捣,制定了文本字段每個部件的邊界范圍侠姑。以下方法都可以重寫。
–?textRectForBounds: ? //重寫來重置文字區(qū)域
–?drawTextInRect: ?? ? //改變繪文字屬性.重寫時調(diào)用super可以按默認圖形屬性繪制,若自己完全重寫繪制函數(shù)箩做,就不用調(diào)用super了.
–?placeholderRectForBounds: //重寫來重置占位符區(qū)域
–?drawPlaceholderInRect: //重寫改變繪制占位符屬性.重寫時調(diào)用super可以按默認圖形屬性繪制,若自己完全重寫繪制函數(shù)莽红,就不用調(diào)用super了.
–?borderRectForBounds: //重寫來重置邊緣區(qū)域
–?editingRectForBounds: //重寫來重置編輯區(qū)域
–?clearButtonRectForBounds: //重寫來重置clearButton位置,改變size可能導致button的圖片失真
–?leftViewRectForBounds:
–?rightViewRectForBounds:
inputView //代替標準的系統(tǒng)鍵盤
inputAccessoryView //編輯時顯示在系統(tǒng)鍵盤或用戶自定義的inputView上面的視圖
類要遵守UITextFieldDelegate協(xié)議
text.delegate = self; 聲明text的代理是我,我會去實現(xiàn)把鍵盤往下收的方法?這個方法在UITextFieldDelegate里所以我們要遵守UITextFieldDelegate這個協(xié)議
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
[textresignFirstResponder];? ? //主要是[receiverresignFirstResponder]在哪調(diào)用就能把receiver(text)對應(yīng)的鍵盤往下收
return YES;
}
代理方法
-?(BOOL)textFieldShouldBeginEditing:(UITextField?*)textField{
//返回一個BOOL值邦邦,YES代表允許編輯安吁,NO不允許編輯.
return?YES;
}
-?(void)textFieldDidBeginEditing:(UITextField?*)textField{
//開始編輯時觸發(fā)醉蚁,文本字段將成為first?responder
}
-?(BOOL)textFieldShouldEndEditing:(UITextField?*)textField{
//返回BOOL值,指定是否允許文本字段結(jié)束編輯鬼店,當編輯結(jié)束馍管,文本字段會讓出first?responder
//要想在用戶結(jié)束編輯時阻止文本字段消失,可以返回NO 薪韩,返回NO确沸,點擊鍵盤的返回按鈕會無效果。
//這對一些文本字段必須始終保持活躍狀態(tài)的程序很有用俘陷,比如即時消息
return?NO;
}
- (void)textFieldDidEndEditing:(UITextField*)textField;{
}// 上面返回YES后執(zhí)行;上面返回NO時有可能強制執(zhí)行(e.g.view removed from window)
-?(BOOL)textField:(UITextField*)textField?shouldChangeCharactersInRange:(NSRange)range?replacementString:(NSString?*)string{
//當用戶使用自動更正功能罗捎,把輸入的文字修改為推薦的文字時,就會調(diào)用這個方法拉盾。
//這對于想要加入撤銷選項的應(yīng)用程序特別有用
//可以跟蹤字段內(nèi)所做的最后一次修改桨菜,也可以對所有編輯做日志記錄,用作審計用途。
//要防止文字被改變可以返回NO
//這個方法的參數(shù)中有一個NSRange對象捉偏,指明了被改變文字的位置倒得,建議修改的文本也在其中
return?YES;
}
-?(BOOL)textFieldShouldClear:(UITextField?*)textField{
//返回一個BOOL值指明是否允許根據(jù)用戶請求清除內(nèi)容
//可以設(shè)置在特定條件下才允許清除內(nèi)容
return?YES;
}
-(BOOL)textFieldShouldReturn:(UITextField?*)textField{
//返回一個BOOL值,指明是否允許在按下回車鍵時結(jié)束編輯
//如果允許要調(diào)用resignFirstResponder?方法夭禽,這回導致結(jié)束編輯霞掺,而鍵盤會被收起[textField?resignFirstResponder];
//查一下resign這個單詞的意思就明白這個方法了
return?YES;
}
UITextField派生自UIControl,所以UIControl類中的通知系統(tǒng)在文本字段中也可以使用讹躯。除了UIControl類的標準事件菩彬,你還可以使用下列UITextField類特有的事件
UITextFieldTextDidBeginEditingNotification
UITextFieldTextDidChangeNotification
UITextFieldTextDidEndEditingNotification
當文本字段退出編輯模式時觸發(fā)。通知的object屬性存儲了最終文本潮梯。
因為文本字段要使用鍵盤輸入文字骗灶,所以下面這些事件發(fā)生時,也會發(fā)送動作通知
UIKeyboardWillShowNotification //鍵盤顯示之前發(fā)送
UIKeyboardDidShowNotification? //鍵盤顯示之后發(fā)送
UIKeyboardWillHideNotification //鍵盤隱藏之前發(fā)送
UIKeyboardDidHideNotification? //鍵盤隱藏之后發(fā)送
1秉馏、Text?:設(shè)置文本框的默認文本耙旦。
2、Placeholder?:?可以在文本框中顯示灰色的字萝究,用于提示用戶應(yīng)該在這個文本框輸入什么內(nèi)容免都。當這個文本框中輸入了數(shù)據(jù)時,用于提示的灰色的字將會自動消失糊肤。
3琴昆、Background?:
4、Disabled?:?若選中此項馆揉,用戶將不能更改文本框內(nèi)容业舍。
5、接下來是三個按鈕,用來設(shè)置對齊方式舷暮。
6态罪、Border Style?:?選擇邊界風格。
7下面、Clear Button?:?這是一個下拉菜單复颈,你可以選擇清除按鈕什么時候出現(xiàn),所謂清除按鈕就是出一個現(xiàn)在文本框右邊的小?X?沥割,你可以有以下選擇:
7.1 Never appears?:?從不出現(xiàn)
7.2 Appears while editing?:?編輯時出現(xiàn)
7.3 Appears unlessediting?:
7.4 Is always visible?:?總是可見
8耗啦、Clear when editingbegins?:?若選中此項,則當開始編輯這個文本框時机杜,文本框中之前的內(nèi)容會被清除掉帜讲。比如,你現(xiàn)在這個文本框?A?中輸入了?"What"?椒拗,之后去編輯文本框?B似将,若再回來編輯文本框?A?,則其中的?"What"?會被立即清除蚀苛。
9在验、Text Color?:?設(shè)置文本框中文本的顏色。
10堵未、Font?:?設(shè)置文本的字體與字號腋舌。
11、Min Font Size?:?設(shè)置文本框可以顯示的最小字體(不過我感覺沒什么用)
12兴溜、Adjust To Fit?:?指定當文本框尺寸減小時侦厚,文本框中的文本是否也要縮小耻陕。選擇它拙徽,可以使得全部文本都可見,即使文本很長诗宣。但是這個選項要跟?Min Font Size?配合使用膘怕,文本再縮小,也不會小于設(shè)定的?Min Font Size?召庞。
接下來的部分用于設(shè)置鍵盤如何顯示岛心。
13、Captitalization?:?設(shè)置大寫篮灼。下拉菜單中有四個選項:
13.1 None?:?不設(shè)置大寫
13.2 Words?:?每個單詞首字母大寫忘古,這里的單詞指的是以空格分開的字符串
13.3 Sentances?:?每個句子的第一個字母大寫,這里的句子是以句號加空格分開的字符串
13.4 All Characters?:?所以字母大寫
14诅诱、Correction?:?檢查拼寫髓堪,默認是?YES?。
15、Keyboard?:?選擇鍵盤類型干旁,比如全數(shù)字驶沼、字母和數(shù)字等。
16争群、Appearance:
17回怜、Return Key?:?選擇返回鍵,可以選擇?Search?换薄、?Return?玉雾、?Done?等。
18轻要、Auto-enable ReturnKey?:?如選擇此項抹凳,則只有至少在文本框輸入一個字符后鍵盤的返回鍵才有效。
19伦腐、Secure?:?當你的文本框用作密碼輸入框時赢底,可以選擇這個選項,此時柏蘑,字符顯示為星號幸冻。
1.Alignment Horizontal?水平對齊方式
2.Alignment Vertical?垂直對齊方式
3.用于返回一個BOOL值 輸入框是否?Selected(選中)Enabled(可用) Highlighted(高亮)
26.UITextField實例一 :?UITextField限制字符 (只為數(shù)字)
iOS代碼
1.#define?ALPHA?@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz?"
2.#define?NUMBERS?@"0123456789n"
3.#define?ALPHANUM?@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789?"
4.#define?NUMBERSPERIOD?@"0123456789."
5.
6.
7.-?(BOOL)textField:(UITextField?*)textField?shouldChangeCharactersInRange:(NSRange)range?replacementString:(NSString?*)string
8.{
9.NSCharacterSet?*cs;
10.cs?=?[[NSCharacterSet?characterSetWithCharactersInString:NUMBERSPERIOD?]?invertedSet];//invertedSet方法是去反字符,把所有的除了數(shù)字的字符都找出來
11.
12.NSString?*filtered?=?[[string?componentsSeparatedByCharactersInSet:cs]?componentsJoinedByString:@""];//componentsSeparatedByCharactersInSet方法是把輸入框輸入的字符string根據(jù)cs中字符一個一個去除cs字符并分割成單字符并轉(zhuǎn)化為NSArray,然后componentsJoinedByString是把NSArray的字符通過""無間隔連接成一個NSString字符賦給filtered.就是只剩數(shù)字了.
13.
14.
15.BOOL?basicTest?=?[string?isEqualToString:filtered];
16.if(!basicTest)
17.
18.{
19.UIAlertView*?alert?=?[[UIAlertView?alloc]?initWithTitle:@"提示"
20.message:@"請輸入數(shù)字"
21.delegate:nil
22.cancelButtonTitle:@"確定"
23.otherButtonTitles:nil];
24.
25.[alert?show];
26.[alert?release];
27.returnNO;
28.}
29.
30.//?Add?any?predicate?testing?here
31.returnbasicTest;
32.}
#define NUMBERS @”0123456789n” (這個代表可以輸入數(shù)字和換行,請注意這個n咳焚,如果不寫這個洽损,Done按鍵將不會觸發(fā),如果用在SearchBar中革半,將會不觸發(fā)Search事件碑定,因為你自己限制不讓輸入n,好慘又官,我在項目中才發(fā)現(xiàn)的延刘。) 所以,如果你要限制輸入英文和數(shù)字的話六敬,就可以把這個定義為: #define kAlphaNum@”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″碘赖。 當然,你還可以在以上方法return之前外构,做一提示的普泡,比如提示用戶只能輸入數(shù)字之類的。如果你覺得有需要的話审编。
實例:限制只能輸入一定長度的字符
ios代碼
1.-?(BOOL)textField:(UITextField?*)textField?shouldChangeCharactersInRange:(NSRange)range?replacementString:(NSString?*)string;
2.{//string就是此時輸入的那個字符textField就是此時正在輸入的那個輸入框返回YES就是可以改變輸入框的值NO相反
3.
4.if([string?isEqualToString:@"n"])//按回車可以改變
5.{
6.returnYES;
7.}
8.
9.NSString?*?toBeString?=?[textField.text?stringByReplacingCharactersInRange:range?withString:string];//得到輸入框的內(nèi)容
10.
11.if(self.myTextField?==?textField)//判斷是否時我們想要限定的那個輸入框
12.{
13.if([toBeString?length]?>20)?{//如果輸入框內(nèi)容大于20則彈出警告
14.textField.text?=?[toBeString?substringToIndex:20];
15.UIAlertView?*alert?=?[[[UIAlertView?alloc]?initWithTitle:nil?message:@"超過最大字數(shù)不能輸入了"delegate:nil?cancelButtonTitle:@"Ok"otherButtonTitles:nil,?nil]?autorelease];
16.[alert?show];
17.returnNO;
18.}
19.}
20.returnYES;
21.}
在UISearchBar中,當輸入信息改變時,它就會調(diào)用textDidChange函數(shù),但是UITextField沒有這個功能,唯一與這個類似的shouldChangeCharactersInRange函數(shù),也是在文件還沒有改變前就調(diào)用了,而不是在改變后調(diào)用,要想實現(xiàn)這個功能,我們可以增加事件監(jiān)聽的方式.先來看看Objective-C提供的接口:
ios代碼
1.//?add?target/action?for?particular?event.?you?can?call?this?multiple?times?and?you?can?specify?multiple?target/actions?for?a?particular?event.
2.給特殊事件添加目標或者方法撼班,你能夠調(diào)用這個方法多次,給特殊事件指定很多目標或者方法
3.//?passing?in?nil?as?the?target?goes?up?the?responder?chain.?The?action?may?optionally?include?the?sender?and?the?event?in?that?order
4.給target傳遞空垒酬,會建立響應(yīng)鏈砰嘁,在這行命令眯亦,方法可以選擇包含方法發(fā)送者和事件兩個參數(shù)。
5.//?the?action?cannot?be?NULL.方法不能為空般码。
6.-?(void)addTarget:(id)target?action:(SEL)action?forControlEvents:(UIControlEvents)controlEvents;
怎么去使用這個接口呢?主要分為兩步,第一步就是在UItextField組件中增加對文件編輯改變時事件的監(jiān)聽,然后再實現(xiàn)監(jiān)聽器監(jiān)聽到事件時,所調(diào)用的方法.
ios代碼
1.//第一步,對組件增加監(jiān)聽器可以在viewDidLoad方法中加入textField為你自定義輸入框的名稱
2.[textField?addTarget:self?action:@selector(textFieldDidChange:)?forControlEvents:UIControlEventEditingChanged];
3....
4.//第二步,實現(xiàn)回調(diào)函數(shù)
5.-?(void)?textFieldDidChange:(id)?sender?{
6.UITextField?*_field?=?(UITextField?*)sender;
7.NSLog(@"%@",[_field?text]);
8.}
UITextField控件處理鍵盤彈出時遮住輸入框的問題
打開鍵盤卷動文本字段
默認情況下打開鍵盤會遮住下面的view妻率,帶來一點點困擾,不過這不是什么大問題板祝,我們使用點小小的手段就可以解決宫静。
首先我們要知道鍵盤的高度是固定不變的,不過在IOS 5.0 以后鍵盤的高度貌似不是216了券时,不過不要緊孤里,我們調(diào)整調(diào)整就是了:
iPhone
ipad
豎屏(portrait)
216
264
橫屏(landScape)
140
352
我們采取的方法就是在textField(有可能是其他控件)接收到彈出鍵盤事件時把self.view整體上移216px了(我們就以iPhone豎屏為例了)。
首先我們要設(shè)置textField的代理橘洞,我們就設(shè)為當前控制器了捌袜。
ios代碼
1.textField,delegate=self;
然后我們在當前控制器實現(xiàn)下面兩個委托方法:
ios代碼
1.-?(void)textFieldDidBeginEditing:(UITextField?*)textField
2.{?//當點觸textField內(nèi)部,開始編輯都會調(diào)用這個方法炸枣。textField將成為first?responder
3.NSTimeInterval?animationDuration?=?0.30f;
4.CGRect?frame?=?self.view.frame;
5.frame.origin.y?-=216;
6.frame.size.height?+=216;
7.self.view.frame?=?frame;
8.[UIView?beginAnimations:@"ResizeView"?context:nil];
9.[UIView?setAnimationDuration:animationDuration];
10.self.view.frame?=?frame;
11.[UIView?commitAnimations];
12.}
ios代碼
1.-?(BOOL)textFieldShouldReturn:(UITextField?*)textField
2.{//當用戶按下ruturn虏等,把焦點從textField移開那么鍵盤就會消失了
3.NSTimeInterval?animationDuration?=?0.30f;
4.CGRect?frame?=?self.view.frame;
5.frame.origin.y?+=216;
6.frame.size.?height?-=216;
7.self.view.frame?=?frame;
8.//self.view移回原位置
9.[UIView?beginAnimations:@"ResizeView"?context:nil];
10.[UIView?setAnimationDuration:animationDuration];
11.self.view.frame?=?frame;
12.[UIView?commitAnimations];
13.[textField?resignFirstResponder];
14.}
UITableView內(nèi)置了兩種樣式:UITableViewStylePlain,UITableViewStyleGrouped
里的方法:
tableView處理步驟
#pragma mark 1.有多少組
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
#pragma mark 2.第section組頭部控件有多高
-(CGFloat)tableView:(UITableView *)tableViewheightForHeaderInSection:(NSInteger)section
#pragma mark 3.第section組有多少行
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section
#pragma mark 4.indexPath這行的cell有多高
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
#pragma mark 5.indexPath這行的cell長什么樣子
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
#pragma mark 6.第section組頭部顯示什么控件
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
//每當有一個cell進入視野屏幕就會調(diào)用适肠,所以在這個方法內(nèi)部就需要優(yōu)化霍衫。
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
if(cell==nil){
//在這里面做創(chuàng)建的工作。循環(huán)優(yōu)化侯养。防止刷新cell進入屏幕的時候重復的創(chuàng)建
}
}
//當調(diào)用reloadData的時候敦跌,會重新刷新調(diào)用數(shù)據(jù)源內(nèi)所有方法,其他事情都不會做呀
[selfreloadData]
//這個方法只有在一開始有多少條數(shù)據(jù)才會算多少個高度,這個方法只會調(diào)用一次逛揩,但是每次reloadData的時候也會調(diào)用
//而且會一次性算出所有cell的高度柠傍,比如有100條數(shù)據(jù),一次性調(diào)用100次
- (CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath:(NSIndexPath*)indexPath
-(NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView//右側(cè)索引
-(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath//行點擊事件
NSIndexPath*path = [self.tableViewindexPathForSelectedRow];//獲得被選中的indexPath可以得到section辩稽,row
[self.tableViewreloadRowsAtIndexPaths:[self.tableViewindexPathsForSelectedRows]withRowAnimation:UITableViewRowAnimationNone];//刷新table指定行的數(shù)據(jù)
[self.tableViewreloadData];//刷新table所有行的數(shù)據(jù)
UITableView常用屬性:
UITableView*tableView = [[UITableViewalloc]initWithFrame:CGRectMake(0,0,320,460)style:UITableViewStylePlain];//初始化表格
分隔線屬性
tableView.separatorStyle=UITableViewCellSeparatorStyleSingleLine;//UITableViewCellSeparatorStyleNone;
[self.tableViewsetSeparatorStyle:UITableViewCellSeparatorStyleNone];//取消分隔線
tableView.separatorColor= [UIColorlightGrayColor];
條目多選
tableView.allowsMultipleSelection=YES;
//設(shè)置標題行高
[_tableViewsetSectionHeaderHeight:kHeaderHeight];
[_tableViewsetSectionFooterHeight:0];
//設(shè)置表格行高
[_tableViewsetRowHeight:50];
//設(shè)置背景色
self.tableView.backgroundView優(yōu)先級高惧笛,如果要設(shè)置backgroundColor的時候要先把view設(shè)置為nil
self.tableView.backgroundColor
//在tableView的頭部或者尾部添加view,footerView寬度是不用設(shè)置的
xxxView.bounds = CGRectMake(0,0,0,height);
self.tableView.tableFooterView=xxxView;
self.tableView.tableHeaderView=xxxView;
UIButton*bt = (UIButton*)[self.contentViewviewWithTag:i+100];
增加tableview滾動區(qū)域
self.tableView.contentInset=UIEdgeInsetsMake(0,0, xx,0);
//創(chuàng)建UITableViewCell
UITableViewCell*cell = [[UITableViewCellalloc]
initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:nil];
[cell.textLabelsetBackgroundColor:[UIColorclearColor]];//清空標簽背景顏色
cell.backgroundView=xx;//設(shè)置背景圖片
cell.backgroundVColor=xx;
cell.selectedBackgroundView= selectedBgView; //設(shè)置選中時的背景顏色
cell.accessoryView = xxxView;//設(shè)置右邊視圖
[cellsetAccessoryType:UITableViewCellAccessoryNone]; //設(shè)置右側(cè)箭頭
[selfsetSelectionStyle:UITableViewCellSelectionStyleNone];//選中樣式
cell.selectionStyle=UITableViewCellSelectionStyleBlue;
//設(shè)置cell的高度
- (CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath:(NSIndexPath*)indexPath
contentView下默認有3個子視圖,其中的2個是UILabel搂誉,通過textLabel和detailTextLabel屬性訪問徐紧,第3個是UIImageView,通過imageView屬性訪問.
UITableViewCellStyleDefault,UITableViewCellStyleValue1, UITableViewCellStyleValue2,UITableViewCellStyleSubtitle
#pragma mark -重新調(diào)整UITalbleViewCell中的控件布局
- (void)layoutSubviews{
[superlayoutSubviews];
…
}
cell 里面還有一個contentView
UITableViewCell對象的重用原理:
重用原理:當滾動列表時炭懊,部分UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中拂檩,等待重用侮腹。當UITableView要求dataSource返回UITableViewCell時,dataSource會先查看這個對象池稻励,如果池中有未使用的UITableViewCell父阻,dataSource會用新的數(shù)據(jù)配置這個UITableViewCell愈涩,然后返回給UITableView,重新顯示到窗口中加矛,從而避免創(chuàng)建新對象
還有一個非常重要的問題:有時候需要自定義UITableViewCell(用一個子類繼承UITableViewCell)履婉,而且每一行用的不一定是同一種UITableViewCell(如短信聊天布局),所以一個UITableView可能擁有不同類型的UITableViewCell斟览,對象池中也會有很多不同類型的UITableViewCell毁腿,時可能會得到錯誤類型的UITableViewCell那么UITableView在重用UITableViewCell。解決方案:UITableViewCell有個NSString *reuseIdentifier屬性苛茂,可以在初始化UITableViewCell的時候傳入一個特定的字符串標識來設(shè)置reuseIdentifier(一般用UITableViewCell的類名)已烤。當UITableView要求dataSource返回UITableViewCell時,先通過一個字符串標識到對象池中查找對應(yīng)類型的UITableViewCell對象妓羊,如果有胯究,就重用,如果沒有躁绸,就傳入這個字符串標識來初始化一個UITableViewCell對象
/**
單元格優(yōu)化
1.標示符統(tǒng)一裕循,使用static的目的可以保證表格標示符永遠只有一個
2.首先在緩沖池中找名為"myCell"的單元格對象
3.如果沒有找到,實例化一個新的cell
**/
- (UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{
staticNSString*cellIdentifier =@"myCell";
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:cellIdentifier];
//使用這種方法不用判斷下面的cell
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:cellIdentifierforIndexPath:indexPath];
if(cell ==nil) {
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdentifier];
}
returncell;
}
刪除净刮、插入
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;開啟表格編輯狀態(tài)
- (UITableViewCellEditingStyle)tableView:(UITableView*)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath{
返回表格編輯編輯樣式费韭。不實現(xiàn)默認都是刪除
return editingStyle : UITableViewCellEditingStyleDelete,UITableViewCellEditingStyleInsert
}
- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyleforRowAtIndexPath:(NSIndexPath*)indexPath{
//根據(jù)editingStyle處理是刪除還是添加操作
完成刪除、插入操作刷新表格
- (void)insertRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation;
-(void)deleteRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation;
}
移動
- (void)tableView:(UITableView*)tableView moveRowAtIndexPath:(NSIndexPath*)sourceIndexPathtoIndexPath:(NSIndexPath*)destinationIndexPath
sourceIndexPath移動的行
destinationIndexPath目標的行
storyboard方式創(chuàng)建:
直接拖到UITableView里面設(shè)置UITableViewCell
注意:
1.通過XIB或者Storyboard自定義單元格時庭瑰,在xib和Storyboard里面需要指定單元格的可重用標示符Identifier
2.注意表格的優(yōu)化中的差別
在Storyboard中兩者等效
xxCell*cell =[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
xxCell*cell1 = [tableViewdequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:indexPath];
在xib文件中有差別:
第一種情況星持,只能在iOS6以上使用,如果在viewDidLoad注冊了nib文件弹灭,并且指定了“單元格”的可重用標示符督暂,那么
dequeueReusableCellWithIdentifier:
dequeueReusableCellWithIdentifier:forIndexPath:
方法是等效的。如果在viewDidLoad中注冊了nib文件穷吮,表格緩沖池中的管理逻翁,有系統(tǒng)接管!
第二種情況捡鱼,是在iOS 4以上均可以使用八回,如果沒有在viewDidLoad注冊nib文件,那么驾诈,只能使用
dequeueReusableCellWithIdentifier:并且需要判斷cell沒有被實例化缠诅,并做相應(yīng)的處理
在代碼創(chuàng)建中差別:
用代碼創(chuàng)建cell中的處理和nib一樣,注冊了cell就有系統(tǒng)接管并且可以用帶forIndexPath的方法乍迄,沒有注冊就要自己去實例化cell管引,不能用帶forIndexPath的方法
[tableViewregisterClass:XxxCellclass]forCellReuseIdentifier:@"xxCell"];
xib方式創(chuàng)建:
//注冊Identifier
- (void)viewDidLoad{
[superviewDidLoad];
/**
注意:以下幾句注冊XIB的代碼,一定要在viewDidLoad中闯两!
注冊XIB文件,獲得根視圖褥伴,并且轉(zhuǎn)換成TableView,為tableView注冊xib
Identifier名要在xib文件中定義谅将,并且保持一致
**/
UINib*nib = [UINibnibWithNibName:@"BookCell"bundle:[NSBundlemainBundle]];
UITableView*tableView = (UITableView*)self.view;
[tableViewregisterNib:nibforCellReuseIdentifier:@"bookCell"];
}
//沒有注冊Identifier只能使用下面方法
staticNSString*CellIdentifier=@"bookCell";
BookCell*cell =[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
if(cell ==nil) {
cell = [[BookCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];
NSBundle*bundle = [NSBundlemainBundle];
NSArray*array = [bundleloadNibNamed:@"BookCell"owner:niloptions:nil];
cell = [arraylastObject];
}
代碼方式創(chuàng)建:
1.?????????????????建立UITableViewCell的類,繼承UITableViewCell
2.?????????????????往cell里面加入view的時候注意點:
//新建的組件放入contentView中
[self.contentViewaddSubview:xxView];
//設(shè)置圖片拉伸屬性stretch
UIImage*normalImage = [UIImageimageNamed:@"xx.png"];
normalImage= [normalImagestretchableImageWithLeftCapWidth:
normalImage.size.width/2topCapHeight:normalImage.size.height/2];
//在tableView里面viewDiDLoad里面要注冊cell類
[tableViewregisterClass:XxxCellclass]forCellReuseIdentifier:@"xxCell"];
//自定義表格在這個方法中定義
-(UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section
-(NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section
處于on時switch?的顏色
switchImage.onTintColor?=?[UIColor?grayColor];
處于off時switch?的顏色
switchImage.tintColor?=?[UIColor?greenColor];
設(shè)置on?的圖標
switchImage.onImage?=?[UIImage?imageNamed:@"1.png"];
設(shè)置off的圖標
switchImage.offImage?=?[UIImage?imageNamed:@"4.png"];
設(shè)置switch的開關(guān)
swithImage.on = YES;
設(shè)置拇指顏色
swithImage.thumbTintColor = [UIColorredColor];
效果:
監(jiān)聽的是這個事件:UIControlEventValueChanged重慢,值改變事件
[switchImage?addTarget:self?action:@selector(switchOn)?forControlEvents:UIControlEventValueChanged];
1.?????minimumValue??: 當值可以改變時饥臂,滑塊可以滑動到最小位置的值,默認為0.0
_slider.minimumValue =10.0;
2.?????maximumValue?: 當值可以改變時似踱,滑塊可以滑動到最大位置的值隅熙,默認為1.0
_slider.maximumValue=100.0;
3.?????continuous: 如果設(shè)置YES,在拖動滑塊的任何時候屯援,滑塊的值都會改變猛们。默認設(shè)置為YES
[_slidersetContinuous:NO];//在滑塊滑動結(jié)束時才獲取滑塊的值
4.?????minimumValueImage?: 滑塊條最小值處設(shè)置的圖片,默認為nil
_slider.minimumValueImage= [UIImageimageNamed:@"003.png"];
5.?????maximumValueImage狞洋,滑塊條最大值處設(shè)置的圖片,默認為nil
_slider.maximumValueImage= [UIImageimageNamed:@"002.png"];
6.minimumTrackTintColor?:?小于滑塊當前值滑塊條的顏色弯淘,默認為藍色
_slider.minimumTrackTintColor= [UIColorredColor];
7.maximumTrackTintColor:?大于滑塊當前值滑塊條的顏色,默認為白色
_slider.maximumTrackTintColor= [UIColorgreenColor];
8.thumbTintColor?:?當前滑塊的顏色吉懊,默認為白色
_slider.thumbTintColor= [UIColoryellowColor];
9.currentMaximumTrackImage?:?滑塊條最大值處設(shè)置的圖片
10.currentMinimumTrackImage?:?滑塊條最小值處設(shè)置的圖片
設(shè)置segment的顯示樣式庐橙。
typedefNS_ENUM(NSInteger,UISegmentedControlStyle) {
UISegmentedControlStylePlain,// largeplain系統(tǒng)默認平板樣式
segmentedControl.segmentedControlStyle =UISegmentedControlStylePlain;
UISegmentedControlStyleBordered,// largebordered黑邊樣式
segmentedControl.segmentedControlStyle =UISegmentedControlStyleBordered;
UISegmentedControlStyleBar,// small button/nav bar style. Tintable條狀樣式
segmentedControl.segmentedControlStyle=UISegmentedControlStyleBar;
UISegmentedControlStyleBezeled,// DEPRECATED. Do not use this style.這個類型不要使用,用了會報錯喔。
};
Default tintColor is nil. Only used ifstyle is UISegmentedControlStyleBar
默認空借嗽,只有使用UISegmentedControlStyleBar态鳖,才能設(shè)置漸變顏色。
segmentedControl.segmentedControlStyle=UISegmentedControlStyleBar;
segmentedControl.tintColor= [UIColorredColor];
效果:
默認為NO
segmentedControl.momentary=No;
點擊之后效果:
segmentedControl.momentary=YES;
點擊之后效果:
獲取總選項數(shù)segmentedControl.numberOfSegments
用來設(shè)置選中項或者返回選中項恶导。
segmentedControl.selectedSegmentIndex =2;//設(shè)置默認選擇項索引
segmentedControl.selectedSegmentIndex //獲取選中項
6.- (void)setTitle:(NSString*)title forSegmentAtIndex:(NSUInteger)segment;
[segmentedControl setTitle:@"two"forSegmentAtIndex:1];//設(shè)置指定索引的題目
效果:
7. - (void)setImage:(UIImage *)imageforSegmentAtIndex:(NSUInteger)segment;
[segmentedControl setImage:[UIImage imageNamed:@"lan.png"]forSegmentAtIndex:3];//設(shè)置指定索引的圖片
8.-(void)insertSegmentWithTitle:(NSString*)titleatIndex:(NSUInteger)segment animated:(BOOL)animated;
[segmentedControlinsertSegmentWithTitle:@"add"atIndex:3animated:NO];//在指定索引插入一個選項并設(shè)置題目
效果:
9.-(void)insertSegmentWithImage:(UIImage*)image? atIndex:(NSUInteger)segmentanimated:(BOOL)animated;
[segmentedControlinsertSegmentWithImage:[UIImageimageNamed:@"mei.png"]atIndex:2animated:NO];//在指定索引插入一個選項并設(shè)置圖片
10.- (void)removeSegmentAtIndex:(NSUInteger)segmentanimated:(BOOL)animated;
[segmentedControlremoveSegmentAtIndex:0animated:NO];//移除指定索引的選項
效果:
11. - (void)removeAllSegments;
//移除所有選項
//[segmentedControlremoveAllSegments];
12. - (void)setWidth:(CGFloat)widthforSegmentAtIndex:(NSUInteger)segment;// set to 0.0 width to autosize. default is0.0
選項卡的寬度默認為0浆竭,此方法能夠設(shè)置選項卡寬度。
[segmentedControlsetWidth:70.0forSegmentAtIndex:2];//設(shè)置指定索引選項的寬度
效果:
13. - (void)setContentOffset:(CGSize)offsetforSegmentAtIndex:(NSUInteger)segment;// adjustoffset of image or text inside the segment. default is (0,0)
[segmentedControlsetContentOffset:CGSizeMake(10,0)forSegmentAtIndex:1];
設(shè)置選項卡內(nèi)部文字或者圖片與默認位置的偏移量惨寿,默認位置在選項卡的中心邦泄。
效果:
14. - (void)setEnabled:(BOOL)enabledforSegmentAtIndex:(NSUInteger)segment;
[segmentedControl setEnabled:NO forSegmentAtIndex:4];//設(shè)置指定索引選項不可選
監(jiān)聽的是這個事件:UIControlEventValueChanged,值改變事件
[segmentedControladdTarget:selfaction:@selector(itemClick)forControlEvents:UIControlEventValueChanged];
默認CGPointZero裂垦,用來設(shè)置scrollView的滾動偏移量顺囊。
//設(shè)置scrollView的滾動偏移量
scrollView.contentOffset=CGPointMake(0,200);
默認CGSizeZero,用來設(shè)置scrollView的滾動范圍蕉拢。
//設(shè)置scrollView的滾動范圍
scrollView.contentSize=CGSizeMake(self.view.bounds.size.width,self.view.bounds.size.height*2);
默認UIEdgeInsetsZero特碳,用來設(shè)置scrollView的額外滾動區(qū)域。
//設(shè)置scrollView的額外頂部滾動區(qū)域:(UIEdgeInsetsMake是逆時針設(shè)置晕换,上左下右)
scrollView.contentInset=UIEdgeInsetsMake(100,0,0,0);
4. bounces
默認為YES午乓,用來設(shè)置scrollView的彈簧效果
//取消scrollView的彈簧效果
scrollView.bounces=NO;
默認為NO,用來設(shè)置scrollView是否開啟分頁.
//開啟分頁
scrollView.pagingEnabled=YES;
默認為YES届巩,用來設(shè)置scrollView是否允許滾動.
// scrollView禁止?jié)L動
scrollView.scrollEnabled=NO;
7.showsHorizontalScrollIndicator
默認為YES硅瞧,用來設(shè)置scrollView是否顯示水平滾動條.
//隱藏水平滾動條
scrollView.showsHorizontalScrollIndicator=NO;
8.showsVerticalScrollIndicator
默認為YES,用來設(shè)置scrollView是否顯示垂直滾動條.
//隱藏垂直滾動條
scrollView.showsVerticalScrollIndicator=NO;
默認1.0恕汇,用來設(shè)置scrollView最少縮小比例.
//設(shè)置scrollView允許子視圖的最大放大比例
scrollView.maximumZoomScale=2;
默認1.0腕唧,用來設(shè)置scrollView最大放大比例.
//設(shè)置scrollView允許子視圖的最小縮放比例
scrollView.minimumZoomScale=0.8;
類要遵守UIScrollViewDelegate協(xié)議
scrollView.delegate = self; 聲明scrollView的代理是我,?這個方法在UIScrollViewDelegate里所以我們要遵守UIScrollViewDelegate這個協(xié)議
11.1當scrollView的偏移量一改變就會調(diào)用這個方法瘾英,即滾動scrollView就會調(diào)用枣接。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
11.2當scrollView縮放時,就會調(diào)用這個方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollViewNS_AVAILABLE_IOS(3_2);
- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView;
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollViewwithVelocity:(CGPoint)velocity targetContentOffset:(inoutCGPoint *)targetContentOffsetNS_AVAILABLE_IOS(5_0);
- (void)scrollViewDidEndDragging:(UIScrollView*)scrollViewwillDecelerate:(BOOL)decelerate;
- (void)scrollViewWillBeginDecelerating:(UIScrollView*)scrollView;
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView;
11.8 返回需要縮放哪個視圖,這個視圖必須是scrollView里的子視圖湿蛔。
- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView;
// 列如:
- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
{
returnscrollView.subviews[0];
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollViewwithView:(UIView *)viewNS_AVAILABLE_IOS(3_2);
- (void)scrollViewDidEndZooming:(UIScrollView*)scrollView withView:(UIView*)view atScale:(float)scale;
11.11沒有開啟分頁的時候膀曾,代理方法調(diào)用順序:
scrollViewWillBeginDragging –> scrollViewDidScroll-> scrollViewWillEndDragging -> scrollViewDidEndDragging
scrollViewWillBeginDragging -> scrollViewDidScroll-> scrollViewDidEndDragging ->scrollViewWillBeginDecelerating ->scrollViewDidScroll-> scrollViewDidEndDecelerating
指定控件是否只能在一個方向上滾動
改變scrollerView的減速點位置
監(jiān)控當前目標是否正在被跟蹤
改變scrollerView的減速點位置
控制視圖是否延時調(diào)用開始滾動的方法
控制控件是否接觸取消touch的事件
設(shè)定滾動條的樣式
監(jiān)控當前目標是否正在減速