IOS 學習筆記(5) 控制元件 文字檢視(UITextView)的使用方法

haibo wang發表於2014-04-14

相對於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 }

執行效果如下:

 

相關文章