相對於UILabell所支援的較短文字內容,UITextView對於長文字的支援更好。UITextView能夠以滾動的方式全部瀏覽到長文字,並且就像UILabel那樣,從ISO6,他也提供了對NSAttributeString的支援.
1.不可編輯的文字檢視控制元件
在類檔案中宣告一個UITextView的IBOutlet物件
@property (nonatomic, retain) IBOutlet UITextView *textView;
textView的程式碼配置示例如下:
//背景顏色 self.textView.backgroundColor = [UIColor lightGrayColor]; //文字顏色 self.textView.textColor = [UIColor blackColor]; //文字字型 self.textView.font = [UIFont systemFontOfSize:14.0f]; //排版 self.textView.textAlignment = NSTextAlignmentLeft; //是否支援滾動 self.textView.scrollEnabled = YES; //確保靜態文字不可編輯 self.textView.editable = NO;
另外,如果想要控制元件擁有圓角和邊線,可以使用UIView的CALayer物件進行配置,再引入QuartzCore的系統框架後,實現程式碼如下:
#import <QuartzCore/QuartzCore.h> ... //邊框 self.textView.layer.borderColor = [UIColor blackColor].CGColor; self.textView.layer.borderWidth = 2.0; //圓角 self.textView.layer.cornerRadius = 5.0;
簡單的配置程式碼不僅將UITextView顯示可以上下拖動瀏覽(文字內容的“\n”起到了換行的作用)還顯示優雅的邊框。
UITextView還能夠從他的內容中自動的檢測到超連結,地址,電話,日曆項等元素,並且以相應的系統內建動作來處理。
1 //自動檢測的內容型別 2 self.textView.dataDetectorTypes = UIDataDetectorTypeAll; 3 self.textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber | UIDataDetectorTypeLink | UIDataDetectorTypeAddress | UIDataDetectorTypeCalendarEvent;
2.自定義選中文字後的彈出選項
相對於普通文字內容長按是,系統會彈出一個放大鏡來放大當前選中的文字。如果此時鬆手又會發現一個系統的貼心服務,他會在選中的地方之上彈出一個備選的動作選單列表,讓使用者的選擇文字操作變得有意義起來。
其中“copy”會將所選中文字複製到系統貼上板上,"Paste"則會將貼上板上的內容貼上在所選區域。我們還可以自定義彈出選項。程式碼如下:
1 //為系統的動作選單中增加一項候選項 2 UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:@"I Love You" action:@selector(actLoveU:)]; 3 UIMenuController *menu = [UIMenuController sharedMenuController]; 4 [menu setMenuItems:[NSArray arrayWithObjects:menuItem, nil]]; 5 6 //隨後重寫UIResponder類的方法 7 -(BOOL)canPerformAction:(SEL)action withSender:(id)sender 8 { 9 //顯示“I Love You” 10 if(action == @selector(actLoveU:)) 11 { 12 //如果UITextView控制元件意有所指 13 if(self.textView.selectedRange.length>0) 14 { 15 return YES; 16 } 17 } 18 //不破壞原有機制 19 return [super canPerformAction:action withSender:sender]; 20 } 21 22 //最後完成actLoveU:的響應函式 23 -(IBAction)actLoveU:(id)sender 24 { 25 //任意響應內容 26 NSLog(@"I Love You"); 27 }
顯示效果如圖所示:
3.可編輯的文字檢視
當開發者將UITextView設定成可編輯的狀態時,每當使用者點選到UITextView中任何內容,系統預設會彈出一個鍵盤供文字輸入。並且由於UITextView遵守了UITextInputTraits的協議,對於輸入內容來說,諸如是否首字母大寫,是否開啟自動校正,是否開啟拼寫檢查,以及彈出鍵盤的式樣等都可以從UITextView物件中進行配置,再輸入的過程中,或許我們相對輸入的內容做些某些特殊指定。程式碼如下:
//確保靜態文字可編輯 self.textView.editable = YES; //所有輸入文字的句子首字母大寫 self.textView.autocapitalizationType = UITextAutocapitalizationTypeSentences; //自動校正開始 self.textView.autocorrectionType = UITextAutocorrectionTypeYes; //拼寫檢查開始 self.textView.spellCheckingType = UITextSpellCheckingTypeYes; //沒有輸入內容時,鍵盤返回鍵置灰 self.textView.enablesReturnKeyAutomatically = YES; //鍵盤外觀 self.textView.keyboardAppearance = UIKeyboardAppearanceAlert; //鍵盤種類 self.textView.keyboardType = UIKeyboardTypeEmailAddress; //鍵盤返回鍵的種類 self.textView.returnKeyType = UIReturnKeyDone; //輸入內容是否加密 self.textView.secureTextEntry = NO;
4.收起鍵盤
系統所彈出鍵盤雖然會自動顯示,但是他是否隱藏卻常常需要開發者自己控制,一般有兩種方式可以讓鍵盤隱藏起來,首先就是對於當前的UITextView物件通過執行resignFirstResponder方法來退出物件自己作為螢幕的第一焦點。再則,對於UITextView所在的檢視物件UIView進行“endEdit:Yes”的呼叫也可以讓檢視上所有的控制元件都退出第一焦點。是的,就像你所想的那樣,系統的鍵盤之所以顯示出來,正是因為系統檢測到使用者將焦點移到了UITextView上欲進行文字輸入。
如果成了UITextView的代理物件,將會收到一系列包括開始編輯,結束編輯,修改內容等代理方法被動呼叫,這些代理回撥方法如下:
(1)是否允許編輯
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
(2)開始編輯
-(void)textViewDidBeginEditing:(UITextView *)textView
(3)新的內容被輸入,並且有可能會替代當前的某些內容
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
(4)文字內容已經被修改
-(void)textViewDidChange:(UITextView *)textView
(5)文字的選中內容發生變化
-(void)textViewDidChangeSelection:(UITextView *)textView
(6)是否允許結束編輯
-(BOOL)textViewShouldEndEditing:(UITextView *)textView
(7)結束編輯狀態
-(void)textViewDidEndEditing:(UITextView *)textView
既然“返回鍵”不能作為鍵盤的觸發鍵,那對於UITextView的鍵盤收起問題,我們以諸多使用者體驗優秀的前輩程式作為參考得出如下三種方案:
(1)在介面上方增加一條導航欄並且在導航欄右側提供一個”完成“按鈕,當“textViewDidBeginEditing”代理方法回撥時,將此按鈕顯示出來,相反的,當"textViewDidEndEditing"代理方法回撥時,按鈕需要隱藏
(2)在整個螢幕的背景上增加一個捕獲"點選事件"的檢視,當捕獲到事件時無條件地收起鍵盤。
(3)在鍵盤上端增加一條工具欄,其中提供一個“完成”按鈕以收起鍵盤.
比較這3種方案,最後一種是使用者體驗最好的一項。使用UITextView的inputAccessoryView屬性將會很方便地實現這項方案,具體程式碼如下:
1 //工具欄 2 UIToolbar *accessBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.view.frame), 44.0f)]; 3 [accessBar setBarStyle:UIBarStyleBlackOpaque]; 4 5 //從左至右,工具欄第一個控制元件是"可拉伸的空間",會將之後的控制元件頂向右側 6 UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 7 //第二個控制元件“Done”,由於”有可拉伸的空間“在左側存在,所以“Done”被頂到最右側 8 UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(actFinishInput:)]; 9 [accessBar setItems:[NSArray arrayWithObjects:space,doneButton, nil]]; 10 11 //鍵盤上端的輔助檢視設定 12 self.textView.inputAccessoryView = accessBar; 13 14 15 -(IBAction)actFinishInput:(id)sender 16 { 17 //收起鍵盤 18 [self.view endEditing:YES]; 19 }
執行效果如下: