2016-07-30 37 views
1

So weiß ich, dass es ein paar Pfosten wie meins gibt, aber nicht ziemlich, was ich suche. Also hier ist, was ich zu erreichen versuche. Ich habe diesen ViewController, der so aussieht.Wie man Höhe von UITextView dynamisch justiert

enter image description here

Wenn ein Benutzer Text in die UITextView, die derzeit den Text „Beschreibung“ hat, ich will so die Höhe der UITextView dynamisch ändern, wenn der Text, in dem mehrere Zeilen werden oder Bildschirm gehen Der Benutzer kann mit seinem Inhalt durch die gesamte Ansicht scrollen. Hier ist mein Programm.

@IBOutlet var scrollView: UIScrollView! 
var projectNameTextField: UITextField! 
var projectCategoryLabel: UIButton! 
var dueDateLabel: UIButton! 
var projectDescription: UITextView! 
var projectDescriptionFrame: CGRect! 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    let scrollViewWidth = scrollView.frame.width 
    scrollView.contentSize.width = scrollViewWidth 

    let trallingSpace: CGFloat = 12.0 
    let contentWidth = scrollViewWidth - (trallingSpace * 2.0) 

    projectNameTextField = UITextField(frame: CGRect(x: trallingSpace, y: scrollViewContentHeight(), width: contentWidth, height: 40)) 
    projectNameTextField.placeholder = "Title" 
    updateScrollView(withView: projectNameTextField) 


    let categoryLabel = UILabel() 
    categoryLabel.text = "Category" 

    projectCategoryLabel = UIButton() 
    projectCategoryLabel.setTitle("Art", forState: .Normal) 
    projectCategoryLabel.setTitleColor(UIColor.blackColor(), forState: .Normal) 

    let stackViewHCategory = UIStackView(frame: CGRect(x: trallingSpace, y: scrollViewContentHeight(), width: contentWidth, height: 40)) 
    stackViewHCategory.axis = .Horizontal 
    stackViewHCategory.spacing = 8 
    stackViewHCategory.addArrangedSubview(categoryLabel) 
    stackViewHCategory.addArrangedSubview(projectCategoryLabel) 
    updateScrollView(withView: stackViewHCategory) 


    let dueDateTitle = UILabel() 
    dueDateTitle.text = "Due Date" 

    dueDateLabel = UIButton() 
    dueDateLabel.setTitle("No Due Date", forState: .Normal) 
    dueDateLabel.setTitleColor(UIColor.blackColor(), forState: .Normal) 

    let stackViewHDueDate = UIStackView(frame: CGRect(x: trallingSpace, y: scrollViewContentHeight(), width: contentWidth, height: 40)) 
    stackViewHDueDate.axis = .Horizontal 
    stackViewHDueDate.spacing = 8 
    stackViewHDueDate.addArrangedSubview(dueDateTitle) 
    stackViewHDueDate.addArrangedSubview(dueDateLabel) 
    updateScrollView(withView: stackViewHDueDate) 


    projectDescription = UITextView(frame: CGRect(x: trallingSpace, y: scrollViewContentHeight(), width: contentWidth, height: 40)) 
    projectDescription.text = "Description" 

    projectDescription.delegate = self 

    projectDescription.scrollEnabled = false 
    projectDescription.font = projectDescription.font?.fontWithSize(14) 

    updateScrollView(withView: projectDescription) 

    projectDescriptionFrame = projectDescription.frame 
    projectDescriptionFrame.size.height = projectDescription.contentSize.height 
    projectDescription.frame = projectDescriptionFrame 
} 

func textViewDidChange(textView: UITextView) { 

    projectDescriptionFrame.size.height = projectDescription.contentSize.height 
    projectDescription.frame = projectDescriptionFrame 

    var contentSizeheight = CGFloat() 

    for (index, viewInScrollView) in scrollView.subviews.enumerate() { 
     if index > 1 { 
      contentSizeheight += viewInScrollView.frame.height 
     } 
    } 

    scrollView.contentSize.height = contentSizeheight 
} 


func updateScrollView(withView withView: UIView) { 
    scrollView.addSubview(withView) 
    scrollView.contentSize.height += withView.frame.height 
} 

func scrollViewContentHeight() -> CGFloat { 

    var height = CGFloat() 

    for (index, viewInScrollView) in scrollView.subviews.enumerate() { 
     if index > 1 { 
      height += viewInScrollView.frame.height 
     } 
    } 

    return height 
} 

Wie kann ich dies tun, so dass es die UITextView Rahmen anpassen und aktualisiert die UIScrollView.contentSize (nicht von UITextView), so kann der Benutzer durch die ganze Ansicht blättern. Und ich würde sagen, ich möchte eine Benutzeroberfläche wie wenn Sie eine neue Nachricht in iOS Mail App erstellen. Dort können Sie den Betreff der E-Mails und den Nachrichtentext als einen zusammenfassen. Bitte hilf mir dabei. Ich habe tagelang daran festgemacht.

enter image description here

Antwort

0

Okay, ich es herausgefunden. Hier ist was ich geändert habe.

In den globalen Eigenschaften.

var oldProjectDescriptionHeight: CGFloat! 

var projectDescriptionHeight: CGFloat! { 
    willSet { 
     oldProjectDescriptionHeight = projectDescriptionHeight 
    } 
} 

Und in der UITextViewDelegatetextViewDidChange

func textViewDidChange(textView: UITextView) { 

    let fixedWidth = textView.frame.size.width 
    textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max)) 
    let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max)) 
    var newFrame = textView.frame 
    newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height) 
    textView.frame = newFrame 

    projectDescriptionHeight = newFrame.height 

    scrollView.contentSize.height += projectDescriptionHeight - oldProjectDescriptionHeight 
}