最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS 開(kāi)發(fā)之UITextField的光標(biāo)操作擴(kuò)展

 更新時(shí)間:2017年06月27日 11:14:45   投稿:lqh  
這篇文章主要介紹了IOS 開(kāi)發(fā)之UITextField的光標(biāo)操作擴(kuò)展的相關(guān)資料,需要的朋友可以參考下

IOS 開(kāi)發(fā)之UITextField的光標(biāo)操作擴(kuò)展

簡(jiǎn)介

在iOS開(kāi)發(fā)中,有時(shí)候需要完全自主的定義鍵盤(pán),用于完整的單詞輸入,例如計(jì)算機(jī)應(yīng)用中,需要一次性的輸入sin(,在移動(dòng)光標(biāo)時(shí)要完整的跳過(guò)sin(,在刪除時(shí)也要完整的刪除,這就需要對(duì)光標(biāo)的位置進(jìn)行精確控制,而ios并沒(méi)有相關(guān)的函數(shù)可以直接操作光標(biāo),只給出了選擇某個(gè)區(qū)域的功能,本文將介紹基于區(qū)域選擇設(shè)計(jì)的UITextField擴(kuò)展,用于獲取光標(biāo)位置以及移動(dòng)光標(biāo)。

實(shí)現(xiàn)原理

光標(biāo)位置的獲取

在textField中,有一個(gè)屬性稱(chēng)之為selectedTextRange,這個(gè)屬性為UITextRange類(lèi)型,包含[start,end)兩個(gè)值,通過(guò)實(shí)驗(yàn)我們可以發(fā)現(xiàn),在沒(méi)有文字被選取時(shí),start代表當(dāng)前光標(biāo)的位置,而end=0;當(dāng)有區(qū)域被選擇時(shí),start和end分別是選擇的頭和尾的光標(biāo)位置,從0開(kāi)始,并且不包含end,例如選擇了0~3的位置,則start=0,end=4。

光標(biāo)的移動(dòng)

通過(guò)setSelectedTextRange:方法可以設(shè)置選取范圍,我們只要設(shè)置一個(gè)選取單個(gè)字符的范圍,即可移動(dòng)光標(biāo)而不選中。

關(guān)鍵屬性

// 內(nèi)容為[start,end),無(wú)論是否有選取區(qū)域,start都描述了光標(biāo)的位置。
@property (nullable, readwrite, copy) UITextRange *selectedTextRange;
// 文首和文尾的位置
@property (nonatomic, readonly) UITextPosition *beginningOfDocument;
@property (nonatomic, readonly) UITextPosition *endOfDocument;

關(guān)鍵方法

// 獲取以from為基準(zhǔn)的to的偏移,例如abcde,光標(biāo)在c后,則光標(biāo)相對(duì)文尾的偏移為-2。
- (NSInteger)offsetFromPosition:(UITextPosition *)from toPosition:(UITextPosition *)toPosition;
// 獲取以from為基準(zhǔn)偏移offset的光標(biāo)位置。
- (nullable UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset;
// 創(chuàng)建一個(gè)UITextRange
- (nullable UITextRange *)textRangeFromPosition:(UITextPosition *)fromPosition toPosition:(UITextPosition *)toPosition;

具體實(shí)現(xiàn)

下面的代碼為UITextField創(chuàng)建了一個(gè)分類(lèi)(Category),包含三個(gè)方法,分別用于獲取光標(biāo)位置、從當(dāng)前位置偏移、從頭偏移。

#import <UIKit/UIKit.h>

@interface UITextField (Extension)

- (NSInteger)curOffset;
- (void)makeOffset:(NSInteger)offset;
- (void)makeOffsetFromBeginning:(NSInteger)offset;

@end

#import "UITextField+Extension.h"

@implementation UITextField (Extension)

- (NSInteger)curOffset{

  // 基于文首計(jì)算出到光標(biāo)的偏移數(shù)值。
  return [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];

}

- (void)makeOffset:(NSInteger)offset{

  // 實(shí)現(xiàn)原理是先獲取一個(gè)基于文尾的偏移,然后加上要施加的偏移,再重新根據(jù)文尾計(jì)算位置,最后利用選取來(lái)實(shí)現(xiàn)光標(biāo)定位。
  UITextRange *selectedRange = [self selectedTextRange];
  NSInteger currentOffset = [self offsetFromPosition:self.endOfDocument toPosition:selectedRange.end];
  currentOffset += offset;
  UITextPosition *newPos = [self positionFromPosition:self.endOfDocument offset:currentOffset];
  self.selectedTextRange = [self textRangeFromPosition:newPos toPosition:newPos];

}

- (void)makeOffsetFromBeginning:(NSInteger)offset{

  // 先把光標(biāo)移動(dòng)到文首,然后再調(diào)用上面實(shí)現(xiàn)的偏移函數(shù)。
  UITextPosition *begin = self.beginningOfDocument;
  UITextPosition *start = [self positionFromPosition:begin offset:0];
  UITextRange *range = [self textRangeFromPosition:start toPosition:start];
  [self setSelectedTextRange:range];
  [self makeOffset:offset];

}

@end

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

瓮安县| 青河县| 陈巴尔虎旗| 如皋市| 灵石县| 襄樊市| 长治县| 金门县| 赤水市| 贵州省| 措勤县| 民丰县| 青铜峡市| 双城市| 玉环县| 合山市| 从江县| 荣昌县| 汝城县| 盐津县| 荥经县| 徐闻县| 拉萨市| 远安县| 广州市| 措美县| 黄梅县| 新昌县| 长兴县| 额敏县| 武安市| 徐汇区| 台中市| 华蓥市| 晋州市| 潍坊市| 镇沅| 永福县| 洞头县| 洛川县| 长泰县|