簡體   English   中英

如何創建多行 UITextfield?

[英]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()不要忘記設置rowHeightestimatedRowHeightUITableView.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM