![](/img/trans.png)
[英]how to create a multiline UITextfield with multiple placeholders programmatically?
[英]How to create a multiline UITextfield?
我正在開發一個應用程序,用戶必須在其中編寫一些信息。 為了這個目的,我需要一個UITextField
其是多行(在一般UITextField
是一個單一的線)。
當我在谷歌搜索時,我找到了為此目的使用UITextView
而不是UITextfield
的答案。
UITextField
特別是一行。
你的谷歌搜索是正確的,你需要使用UITextView
而不是UITextField
來顯示和編輯多行文本。
在 Interface Builder 中,在需要的位置添加UITextView
並選擇“可編輯”框。 默認情況下它將是多行的。
您可以使用 UITextView 偽造 UITextField。 您將遇到的問題是您失去了占位符功能。
如果您選擇使用 UITextView 並需要占位符,請執行以下操作:
在您的 viewDidLoad 中,將顏色和文本設置為占位符:
myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."
然后在選擇 UITextView 時使占位符消失:
func textViewDidBeginEditing (textView: UITextView) {
if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
myTxtView.text = nil
myTxtView.textColor = .white
}
}
當用戶完成編輯時,確保有一個值。 如果沒有,請再次添加占位符:
func textViewDidEndEditing (textView: UITextView) {
if myTxtView.text.isEmpty || myTxtView.text == "" {
myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."
}
}
您可能需要偽造的其他功能:
UITextField 通常將每個字母大寫,您可以將該功能添加到 UITableView:
myTxtView.autocapitalizationType = .words
UITextField 通常不會滾動:
myTxtView.scrollEnabled = false
好的,我用了一些技巧;) 首先構建一個UITextField
並增加它的size
如下所示:
CGRect frameRect = textField.frame;
frameRect.size.height = 53;
textField.frame = frameRect;
然后在您創建UITextField
的同一區域構建一個UITextView
,並刪除其background color
。 現在看起來你有一個多行TextField
!
除了多行行為之外,UITextView 和 UITextField 之間的主要區別在於 UITextView 不建議占位符。 要繞過此限制,您可以使用帶有“假占位符”的 UITextView。
有關詳細信息,請參閱此 SO 問題: Placeholder in UITextView 。
是的,一個 UITextView 就是你要找的。 您必須以不同的方式處理某些事情(例如返回鍵),但您可以向其中添加文本,如果里面有太多文本,它將允許您上下滾動。
此鏈接包含有關制作屏幕以輸入數據的信息:
如果您必須有一個帶有 2 行文本的 UITextField,一種選擇是添加一個 UILabel 作為第二行文本的 UITextField 的子視圖。 我的應用程序中有一個 UITextField,用戶通常沒有意識到它可以通過點擊進行編輯,我想向 UITextField 添加一些小字幕文本,上面寫着“點擊編輯”。
CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";
[textField addSubview:tapEditLbl];
使用 UITextView 而不是 UITextField
補充上面h4xxr的回答,更簡單的調整UITextField高度的方法是在屬性inspectors->Text Field中選擇方形邊框樣式。 (默認情況下,UITextfield 的邊框樣式為橢圓。)
參考:在這里回答布賴恩: 如何設置 UITextField 高度?
這個代碼塊就夠了。 請不要忘記在使用以下擴展之前在 viewDidLoad 或故事板中設置委托:
extension YOUR_VIEW_CONTROLLER: UITextViewDelegate {
func textViewDidBeginEditing (_ textView: UITextView) {
if YOUR_TEXT_VIEW.text.isEmpty || YOUR_TEXT_VIEW.text == "YOUR DEFAULT PLACEHOLDER TEXT HERE" {
YOUR_TEXT_VIEW.text = nil
YOUR_TEXT_VIEW.textColor = .red // YOUR PREFERED COLOR HERE
}
}
func textViewDidEndEditing (_ textView: UITextView) {
if YOUR_TEXT_VIEW.text.isEmpty {
YOUR_TEXT_VIEW.textColor = UIColor.gray // YOUR PREFERED PLACEHOLDER COLOR HERE
YOUR_TEXT_VIEW.text = "YOUR DEFAULT PLACEHOLDER TEXT HERE"
}
}
}
使用textView
代替然后用其委托符合,調用textViewDidChange
該方法調用的方法中tableView.beginUpdates()
和tableView.endUpdates()
不要忘記設置rowHeight
和estimatedRowHeight
到UITableView.automaticDimension
。
還有另一種選擇對我有用:
子類化 UITextField 並覆蓋:
- (void)drawTextInRect:(CGRect)rect
例如,在此方法中,您可以:
NSDictionary *attributes = @{ NSFontAttributeName : self.font,
NSForegroundColorAttributeName : self.textColor };
[self.text drawInRect:verticalAlignedRect withAttributes:attributes];
如果矩形有足夠的空間,此代碼將根據需要使用盡可能多的行來呈現文本。 您可以根據需要指定任何其他屬性。
不使用:
self.defaultTextAttributes
這將強制一行文本呈現
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.