hoe maak je UITextView hoogte dynamisch op basis van tekstlengte?

Zoals je kunt zien in deze afbeelding

de UITextViewverandert de hoogte volgens de tekstlengte, ik wil de hoogte laten aanpassen volgens de tekstlengte.

*Ik zag andere vragen, maar de oplossingen daar werkten niet voor mij

voorbeeld


Antwoord 1, autoriteit 100%

dit Werktvoor mij, alle andere oplossingen niet.

func adjustUITextViewHeight(arg : UITextView)
{
    arg.translatesAutoresizingMaskIntoConstraints = true
    arg.sizeToFit()
    arg.scrollEnabled = false
}

In Swift 4 is de syntaxis van arg.scrollEnabled = falsegewijzigd in arg.isScrollEnabled = false.


Antwoord 2, autoriteit 45%

In Storyboard / Interface Builder schakelt u eenvoudig scrollen uit in de kenmerkcontrole.

In code textField.scrollEnabled = falsezou het lukken.


Antwoord 3, autoriteit 27%

Het enige wat ik hoefde te doen was:

  1. Stel de beperkingen in voor boven, links en rechtsvan de textView.
  2. Scrolling uitschakelenin Storyboard.

Hierdoor kan de automatische lay-out de tekstweergave dynamisch aanpassen op basis van de inhoud.


Antwoord 4, autoriteit 18%

Probeer dit eens:

CGRect frame = self.textView.frame;
frame.size.height = self.textView.contentSize.height;
self.textView.frame = frame;

Bewerken- Hier is de Swift:

var frame = self.textView.frame
frame.size.height = self.textView.contentSize.height
self.textView.frame = frame

Antwoord 5, autoriteit 13%

Swift 4

Voeg het toe aan je klas

UITextViewDelegate

func textViewDidChange(_ textView: UITextView) {
      let fixedWidth = textView.frame.size.width
      textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
      let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
      var newFrame = textView.frame
      newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
      textView.frame = newFrame
}

Antwoord 6, autoriteit 9%

Gevolgd door het antwoord van DeyaEldeen.
In mijn geval. Ik vergroot de hoogte van de tekstweergave automatisch door

. toe te voegen

swift 3

textView.translatesAutoresizingMaskIntoConstraints = false
textView.isScrollEnabled = false


Antwoord 7, autoriteit 6%

Swift 5, Gebruik extensie:

extension UITextView {
    func adjustUITextViewHeight() {
        self.translatesAutoresizingMaskIntoConstraints = true
        self.sizeToFit()
        self.isScrollEnabled = false
    }
}

Gebruiksvoorbeeld:

textView.adjustUITextViewHeight()

En let niet op de hoogte van texeView in het storyboard (gebruik eerst een constante)


Antwoord 8, autoriteit 6%

maak gewoon een verband met de hoogtebeperking van uw textView

@IBOutlet var textView: UITextView!
@IBOutlet var textViewHeightConstraint: NSLayoutConstraint!

en gebruik deze code hieronder

textViewHeightConstraint.constant = self.textView.contentSize.height

Antwoord 9, autoriteit 2%

het is eenvoudig om op een programmatische manier te doen. volg gewoon deze stappen

  1. voeg een waarnemer toe aan de inhoudslengte van het tekstveld

    [yourTextViewObject addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
    
  2. waarnemer implementeren

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    UITextView *tv = object;
        //Center vertical alignment
        CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;
        topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
        tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
        mTextViewHeightConstraint.constant = tv.contentSize.height;
        [UIView animateWithDuration:0.2 animations:^{
            [self.view layoutIfNeeded];
        }];
    }
    
  3. als u wilt dat textviewHeight na enige tijd tijdens het typen niet meer toeneemt, implementeert u dit en stelt u textview delegate in op zichzelf.

    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
        if(range.length + range.location > textView.text.length)
        {
            return NO;
        }
        NSUInteger newLength = [textView.text length] + [text length] - range.length;
        return (newLength > 100) ? NO : YES;
    }
    

Antwoord 10, autoriteit 2%

In mijn project is de view-controller betrokken bij veel beperkingen en StackView, en ik stel de TextView-hoogte in als een beperking, en deze varieert op basis van de textView.contentSize.height-waarde.

stap1: koop een IB-stopcontact

@IBOutlet weak var textViewHeight: NSLayoutConstraint!

stap2: gebruik de delegatiemethode hieronder.

extension NewPostViewController: UITextViewDelegate {
     func textViewDidChange(_ textView: UITextView) {
          textViewHeight.constant = self.textView.contentSize.height + 10
     }
}

Antwoord 11, autoriteit 2%

Beter nog swift 4voeg toe als extensie:

extension UITextView {
    func resizeForHeight(){
        self.translatesAutoresizingMaskIntoConstraints = true
        self.sizeToFit()
        self.isScrollEnabled = false
    }
}

Antwoord 12, autoriteit 2%

SWIFT 4

Verander de grootte tijdens het typen

UITextViewDelegate

func textViewDidChange(_ textView: UITextView) {
        yourTextView.translatesAutoresizingMaskIntoConstraints = true
        yourTextView.sizeToFit()
        yourTextView.isScrollEnabled = false
        let calHeight = yourTextView.frame.size.height
        yourTextView.frame = CGRect(x: 16, y: 193, width: self.view.frame.size.width - 32, height: calHeight)
    }

Verander de grootte bij het laden

func textViewNotasChange(arg : UITextView) {
        arg.translatesAutoresizingMaskIntoConstraints = true
        arg.sizeToFit()
        arg.isScrollEnabled = false
        let calHeight = arg.frame.size.height
        arg.frame = CGRect(x: 16, y: 40, width: self.view.frame.size.width - 32, height: calHeight)
    }

Noem de functie van de tweede optie als volgt aan:

textViewNotasChange(arg: yourTextView)

Antwoord 13

het werkt

func textViewDidChange(_ textView: UITextView) {
    let fixedWidth = textviewconclusion.frame.size.width
    textviewconclusion.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
    let newSize = textviewconclusion.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
    var newFrame = textviewconclusion.frame
    newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
    textviewconclusion.frame = newFrame
}

Antwoord 14

1 Voeg een waarnemer toe aan de inhoudslengte van het tekstveld

  yourTextView.addObserver(self, forKeyPath: "contentSize", options: (NSKeyValueObservingOptions.new), context: nil);

2 Observeer implementeren

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        let tv = object as! UITextView;
        var topCorrect = (tv.bounds.size.height - tv.contentSize.height * tv.zoomScale)/2.0;
        topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
        tv.contentOffset.x = 0;
        tv.contentOffset.y = -topCorrect;
        self.yourTextView.contentSize.height = tv.contentSize.height;
        UIView.animate(withDuration: 0.2, animations: {
            self.view.layoutIfNeeded();
        });
    }

Antwoord 15

Hier zijn twee valkuilen in iOS 8.3 wanneer het wordt geleverd met textView.textContainer.maximumNumberOfLines = 10

Raadpleeg mijn gist, alstublieft.

textView.attributedText = originalContent
let lineLimit = 10
textView.isEditable = true
textView.isScrollEnabled = false
textView.textContainerInset = .zero // default is (8, 0, 8, 0)
textView.textContainer.maximumNumberOfLines = lineLimit // Important condition
textView.textContainer.lineBreakMode = .byTruncatingTail
// two incomplete methods, which do NOT work in iOS 8.3
// size.width可能比maxSize.width小 ————遗憾的是 iOS 8.3 上此方法无视maximumNumberOfLines参数,所以得借助于UILabel
// size.width may be less than maxSize.width, ---- Do NOT work in iOS 8.3, which disregards textView.textContainer.maximumNumberOfLines
// let size = textView.sizeThatFits(maxSize) 
// 遗憾的是 iOS 8.3 上此方法失效了,得借助于UILabel
// Does not work in iOS 8.3
// let size = textView.layoutManager.usedRectForTextContainer(textView.textContainer).size 
// Suggested method: use a temperary label to get its size
let label = UILabel(); label.attributedText = originalContent
let size = label.textRect(forBounds: CGRect(origin: .zero, size: maxSize), limitedToNumberOfLines: lineLimit).size
textView.frame.size = size

Antwoord 16

Verklaring hier

   fileprivate weak var textView: UITextView!

Bel hier je setupview

   override func viewDidLoad() {
        super.viewDidLoad()
         setupViews()
    }

Hier instellen

   fileprivate func setupViews() {
    let textView = UITextView()
    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.text = "your text here"
    textView.font = UIFont.poppinsMedium(size: 14)
    textView.textColor = UIColor.brownishGrey
    textView.textAlignment = .left
    textView.isEditable = false
    textView.isScrollEnabled = false
    textView.textContainerInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
   self.view.addSubview(textView)
   self.textView = textView
   setupConstraints()
   }

Instelbeperkingen hier

  fileprivate func setupConstraints() {
    NSLayoutConstraint.activate([
        textView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
        textView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20),
        textView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20),
        textView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20),
        textView.heightAnchor.constraint(greaterThanOrEqualToConstant: 150),
        ])
  }

Antwoord 17

Telkens wanneer u het formaat van de tekstweergave moet aanpassen aan de inhoud van de binnenkant, zoals in de berichten-app.
Gebruik cocoapods(GrowingTextView), het zal uw leven gemakkelijker maken dan het coderen van het dynamisch formaat wijzigen van tekstweergave op uw eigen.


Antwoord 18

  1. Zet textView in StackView
  2. Stel beperkingen in (boven, onder, links, rechts) voor stackView
  3. Voeg hoogtebeperking toe aan StackView, selecteer deze beperking en stel deze in op ‘Groter dan of gelijk aan’ in Relatie, in het rechterpaneel

Other episodes