玩轉(zhuǎn)RunTime之懶人版TextFiled

玩轉(zhuǎn)RunTime之懶人版TextFiled
序言:

我為什么要寫這篇文章?或許我自己就是一個懶人,我初學iOS的時候瘋狂使用github上面的各種開源庫,當時的想法是這東西太牛逼了,怎么做的,但每每我去深入源碼,又只好因為自己的水平有限而淺嘗則止.但正是由于人類這種特有的惰性而造就了各種好用的工具,從蒸汽機到現(xiàn)在滿大街的汽車,從萊特兄弟的第一架飛機到現(xiàn)在的各種直升機 民用客機..........或許我沒有那么牛逼,我依然希望自己能跟上前人的腳步,這也是我學習走路的一個過程.還有一個原因是,這是@花早同學很久之前提供的想法,我只是將他用代碼實現(xiàn).也許你會說UITextFiled有什么好搞的,不是切菜的東西嗎?但是我依然想對這個小控件進行封裝,因為這是我從MJ老師那里學到的,寫一個更好用 ,更方便我們編程的工具,如果這個這個小東西能省去你一分鐘的時間,我就十分欣慰了,如有不妥當?shù)牡胤较M魑荒艽蠓街赋?

課前準備:

由于這個小東西是基于runtime實現(xiàn)的,所以我們有必要去了解一下runtime的關(guān)聯(lián)對象(Associated Object)這一概念,眾所周知Category是可以添加自定義方法幫助系統(tǒng)的類進行一個功能性的擴展的,但是要添加成員變量就要借助runtime了.應用關(guān)聯(lián)對象可以在運行時添加成員變量.還有一個特性就是xcode6時代就有了的關(guān)鍵字IBInspectable,在我們定義成員變量的時候用這個關(guān)鍵字去修飾,就會讓ui控件的屬性面板生成擴展,像下面這個圖:


屬性面板新添了的屬性
上課!上課!

首先我們?yōu)閁ITextField寫一個category,并為其添加一個控制懶人textfiled開關(guān)的屬性sl_lazyTFOpen

@interface UITextField (SLCategory)
//是否開啟懶人版TextFiled
@property (nonatomic, assign, getter=sl_lazyTFOpen) IBInspectable BOOL lazyTFOpen;
@property (nonatomic, assign) BOOL sl_lazyTFOpen;
@implementation UITextField (SLCategory)
- (void)setSl_lazyTFOpen:(BOOL)sl_lazyTFOpen{
//OBJC_ASSOCIATION_RETAIN 宿主對象銷毀 關(guān)聯(lián)對象也會被銷毀
    objc_setAssociatedObject(self, @selector(sl_lazyTFOpen), @(sl_lazyTFOpen), OBJC_ASSOCIATION_RETAIN);

}

- (BOOL)sl_lazyTFOpen{
    return [objc_getAssociatedObject(self, _cmd) boolValue];

}

- (void)setLazyTFOpen:(BOOL)lazyTFOpen{
    if(!lazyTFOpen) return;
    self.sl_lazyTFOpen = lazyTFOpen;
//lazyTFOpen是yes進行初始化配置
    [self setUPSelf];
}

在setUPSelf方法中我們要做的是監(jiān)聽textfiled的這兩個通知 UIControlEventEditingChanged和
UIControlEventEditingDidBegin
和一些對鍵盤做監(jiān)聽,用在后面的幫助textFiled躲避鍵盤的遮擋:

- (void)setUPSelf{

    [self addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
    [self addTarget:self action:@selector(textDidBegin:) forControlEvents:UIControlEventEditingDidBegin];
    self.inputAccessoryView = _toolBar;
    self.textField = self;
    //監(jiān)聽鍵盤點擊,
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didClickKeyboard:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didKboardDisappear:) name:UIKeyboardWillHideNotification object:nil];

}

以設置textFiled的內(nèi)容長度限制為例,如法炮制添加sl_max這個成員變量,每當監(jiān)聽到textfled的內(nèi)容改變時就進行長度校驗:

- (void)textFieldDidChange:(UITextField *)textField
{
    if (textField == self)
    {
        if (textField.text.length > self.sl_max)
        {
            textField.text = [textField.text substringToIndex:self.sl_max];
            if (self.sl_warningAnimation) {
                [self shake];
            }
        }
    }
}

這樣一來我們的內(nèi)容長度校驗就完成了,其他的控制面板屬性擴展就依樣畫葫蘆吧,或者有興趣的同學可以課后瞄一瞄我的源碼.

textFiled的天敵??

每當我的界面中的輸入框被鍵盤遮擋,就要開始加補丁了,我們得寫上那么些代碼來修復,要是這個東西能自動躲避鍵盤就好了,貌似印度佬做了這件事,但是每當我的同事因為那個庫和自己的代碼有沖突時,就不得不叫苦連天了,很幸運的是我們終于可以刪掉他了,誰叫他沒有一個開關(guān)功能呢!!

我們要思考的問題有兩個:1是我們?nèi)绾巫宼extFiled跟隨鍵盤移動,這個很簡單,當然是利用監(jiān)聽鍵盤做父view的transform動畫!2.當我們的textFiled被多個view嵌套怎么辦?答案固然是計算textFiled的實際位置啦!但是這個計算過程相對復雜 ,我們?yōu)榱撕喕缓靡雜l_superView和sl_textFiledArr這倆個變量,讓用戶自行去配置,這里要說明的是sl_superView我們希望做一個移動動畫的view,這個一般設置為根view,而sl_textFiledArr就是sl_superView的一個數(shù)組屬性,這里面裝載的是textfiled對像.到時候用戶只要這樣配置就可以使用我們的框架了:

正確設置必要屬性
#pragma mark -鍵盤即將跳出
-(void)didClickKeyboard:(NSNotification *)sender{
    CGFloat durition = [sender.userInfo[@"UIKeyboardAnimationDurationUserInfoKey"] doubleValue];
    CGRect keyboardRect = [sender.userInfo[@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];
    CGFloat keyboardHeight = keyboardRect.size.height;
    [ self.sl_superView.sl_textFiledArr enumerateObjectsUsingBlock:^(UITextField *textFiled, NSUInteger idx, BOOL *stop) {
        if (self==textFiled&&[textFiled isFirstResponder]) {
            [UIView animateWithDuration:durition animations:^{
                float h = 0;
                if (self.sl_superView==self.superview) {
                    h =  self.sl_superView.frame.size.height-textFiled.frame.origin.y-self.frame.size.height;
                }else{
               CGRect superVFrame = [self.superview convertRect:self.frame toView:self.sl_superView];
                    h =  self.sl_superView.frame.size.height-textFiled.frame.origin.y-superVFrame.origin.y-self.frame.size.height;
                }
                if (h>keyboardHeight) {
                    return;
                }
                self.sl_superView.transform = CGAffineTransformMakeTranslation(0, h-keyboardHeight);
            }];
        }
    }];
}

當self.superView不是self.sl_superView時進行坐標轉(zhuǎn)換并且計算sl_superView應該移動的距離,已達到躲避鍵盤的效果

設置一下開關(guān),動畫,長度限制

CBFC03B1-0776-486B-A445-F53177378838.png
最后的效果是這樣的:
最終效果!!
結(jié)語:如果你知道這個小東西可以設置字符長度,警告動畫,警告圖片,正則表達式,自動躲避鍵盤,看來還是很酷的.

github://小王子編程之道:在簡單的東西也有它的價值.誠邀你一同感受開源的樂趣 https://github.com/SamCoder123/SLLazyTextFiled 這次真的不是吹水的

swift版本????將由花早同學提供,敬請期待...........
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞒津,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子括尸,更是在濱河造成了極大的恐慌巷蚪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件濒翻,死亡現(xiàn)場離奇詭異屁柏,居然都是意外死亡,警方通過查閱死者的電腦和手機有送,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門淌喻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娶眷,你說我怎么就攤上這事似嗤。” “怎么了届宠?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵烁落,是天一觀的道長。 經(jīng)常有香客問我豌注,道長伤塌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任轧铁,我火速辦了婚禮每聪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘齿风。我一直安慰自己药薯,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布救斑。 她就那樣靜靜地躺著童本,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脸候。 梳的紋絲不亂的頭發(fā)上穷娱,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天绑蔫,我揣著相機與錄音,去河邊找鬼泵额。 笑死配深,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嫁盲。 我是一名探鬼主播篓叶,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亡资!你這毒婦竟也來了澜共?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤锥腻,失蹤者是張志新(化名)和其女友劉穎嗦董,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘦黑,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡京革,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幸斥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匹摇。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甲葬,靈堂內(nèi)的尸體忽然破棺而出廊勃,到底是詐尸還是另有隱情,我是刑警寧澤经窖,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布坡垫,位于F島的核電站,受9級特大地震影響画侣,放射性物質(zhì)發(fā)生泄漏冰悠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一配乱、第九天 我趴在偏房一處隱蔽的房頂上張望溉卓。 院中可真熱鬧,春花似錦搬泥、人聲如沸桑寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽西疤。三九已至,卻和暖如春休溶,著一層夾襖步出監(jiān)牢的瞬間代赁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工兽掰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芭碍,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓孽尽,卻偏偏與公主長得像窖壕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杉女,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容