IOS 簡潔輸入框的實現

2022-03-06 11:05:36 字數 2969 閱讀 3868

我也試著自己寫了乙個小小對話方塊,先看一下樣式

主要的功能有

通過功能區分我們可以大致將該檢視分成三個部分,第乙個是分割線,寬度為1的uiview,第二個是類似html中的具有placeholder功能的輸入框,最後是按鈕button。

輸入框是由uilabel+uitextview+uiimageview(藍色線)實現的,uitextview的內容長度變化可以通過監聽uitextviewtextdidchangenotification來判斷當前輸入框的輸入字數。

先建乙個類繼承uitextview

新增placetext和placecolor到頭檔案由於外部改變placetext內容,現在新增uilable

-(void)placetextlabel

_placetextlab.text=self.placetext;

[_placetextlab sizetofit];

[_placetextlab setframe:cgrectmake(8, 8, cgrectgetwidth(self.bounds)-16, cgrectgetheight(_placetextlab.frame))];

}if (self.text.length==0 && self.placetext.length>0)

}

用photoshop做乙個單行畫素的類似藍線的,儲存為png格式,必須設定的uiimageview的顯示模式

-(void)addlineview
uitextview的設定會相對麻煩一些,重寫初始化**

-(instancetype)initwithframe:(cgrect)frame placetext:(nsstring *)placetext placecolor:(uicolor *)placecolor

return self;

}

由於輸入框會隨著輸入的文字而不斷增高,我們需要把這個值傳遞給父檢視,讓父檢視也能根據內容而增大,可以通過委託來,但是委託又有點重量級,這裡我們可以用更簡單的block這裡首先我想到的是通過監聽uitextviewtextdidchangenotification來實時監測輸入,輸入實時變化引起高度的實時變化。但是不幸的是我掉坑里了,我發現當我們輸入一行到頭以後再輸入乙個字元換行後,這個時候高度居然沒有變。再輸入這一行的第二個字元時候,高度值才發生變化。我想應該是高度變化之前,已經傳送了通知所以導致我們的高度變化其實不是實時的,如果這樣就不能用這種方式了,所幸的我們還可以使用uitextview的乙個簡單函式

cgsize size= [self sizethatfits:cgsizemake(self.contentsize.width, 1000.0)];
這樣size就是我們要的大小了。

-(void)textchange:(nsnotification *)notificationelse

[self addlineview];

if (self.placetext.length==0)

[uiview animatewithduration:0.5 animations:^else

}];}-(void)addsubline:(uiview *)view

[self addsubview:view];

self.viewsize(size);//先判斷一下更好。。。

}

這裡使用block傳遞size,我們先宣告乙個block的私有變數,再寫乙個方法用來賦值,block的實現也是由呼叫該物件的類建立的。然後像委託一樣呼叫就可以,afnetwork中我們可以到處看到block而不像他的前輩asihttprequest到處是委託。

主要的輸入框完工後,就能組裝了,先新建乙個uiview子類。uiview需要和鍵盤高度保持一致。需要監聽鍵盤滑出滑入的通知uikeyboardwillchangeframenotification,實時改變輸入框的高度

-(void)keyboardwillshow:(nsnotification *)notification completion:^(bool finished) ];

}

這裡的maxy是指輸入框的y方向的標準位置。在沒有鍵盤的情況下是[uiscreen mainscreen].bounds.size.height,在有鍵盤的情況是鍵盤的y值,在輸入框字元變化的時候實時改變他的高度

如下面圖所示

-(void)textviewdidchange:(cgsize)size
以上是比較重要的uiview高度自適應變化的問題

這裡button與外部類的呼叫關係也採用的是block的方式

@property (nonatomic,copy)void(^sendtext)(nsstring *);
-(void)sendmessage:(void (^)(nsstring * text))inputtext

}

-(void)buttonclick

-(void)sendinputtextelse}}

最後附上我的sourcecode,獻給那些在ios道路上一起默默前進的小白們,我也是小白,求寬恕的對待o(∩_∩)

iOS 輸入框UITextField輸入限制字數

對某些ios應用來講,輸入框需要有字數的限制,例如,密碼要求輸入最多6位數。那麼如果僅僅只是在 bool textfield uitextfield textfield shouldchangecharactersinrange nsrange range replacementstring nss...

QT IP輸入框的實現

流程圖 我首先在xx.ui介面中畫了四個lineedit 分別取名為 le ip 1,le ip 2,le ip 3,le ip 4 做輸入ip位址用,限定了最大輸入長度為3 三個label 輸入點 最外面的框是乙個容器frame 遇到的問題 解決方法 只能採取笨辦法判斷是哪個lineedit發出訊...

IOS提示框變成秘密輸入框

ialertview alert uialertview alloc initwithtitle alert message this is an example alert delegate self cancelbuttontitle hide otherbuttontitles nil ale...