UITextView mở rộng thành văn bản bằng cách sử dụng bố cục tự động


163

Tôi có một cái nhìn được đặt ra hoàn toàn bằng cách sử dụng bố cục tự động theo chương trình. Tôi có một UITextView ở giữa chế độ xem với các mục ở trên và bên dưới nó. Mọi thứ đều hoạt động tốt, nhưng tôi muốn có thể mở rộng UITextView khi văn bản được thêm vào. Điều này sẽ đẩy mọi thứ bên dưới nó xuống khi nó mở rộng.

Tôi biết làm thế nào để làm điều này theo cách "lò xo và thanh chống", nhưng có một cách bố trí tự động để làm điều này? Cách duy nhất tôi có thể nghĩ đến là bằng cách loại bỏ và thêm lại các ràng buộc mỗi khi nó cần phát triển.


5
Bạn có thể tạo IBOutlet theo giới hạn chiều cao cho chế độ xem văn bản và chỉ cần sửa đổi hằng số khi bạn muốn nó phát triển, không cần phải xóa và thêm.
ndelmar

4
Năm 2017, một mẹo rất lớn thường khiến bạn bực mình : CHỈ CÓ CÔNG VIỆC NẾU BẠN THIẾT LẬP NÓ SAU KHI XEM> NĂM < rất bực bội nếu bạn đặt văn bản nói tại ViewDidLoad - nó sẽ không hoạt động!
Fattie

2
mẹo số 2: nếu bạn gọi [someView.superView layout IfNeeded] THÌ nó có thể hoạt động trong viewWillAppear ();)
Yaro

Câu trả lời:


30

Chế độ xem chứa UITextView sẽ được chỉ định kích thước của nó setBoundsbằng AutoLayout. Vì vậy, đây là những gì tôi đã làm. Giám sát ban đầu được thiết lập tất cả các ràng buộc khác như mong muốn và cuối cùng tôi đặt một ràng buộc đặc biệt cho chiều cao của UITextView và tôi đã lưu nó trong một biến đối tượng.

_descriptionHeightConstraint = [NSLayoutConstraint constraintWithItem:_descriptionTextView
                                 attribute:NSLayoutAttributeHeight 
                                 relatedBy:NSLayoutRelationEqual 
                                    toItem:nil 
                                 attribute:NSLayoutAttributeNotAnAttribute 
                                multiplier:0.f 
                                 constant:100];

[self addConstraint:_descriptionHeightConstraint];

Trong setBoundsphương thức, sau đó tôi thay đổi giá trị của hằng.

-(void) setBounds:(CGRect)bounds
{
    [super setBounds:bounds];

    _descriptionTextView.frame = bounds;
    CGSize descriptionSize = _descriptionTextView.contentSize;

    [_descriptionHeightConstraint setConstant:descriptionSize.height];

    [self layoutIfNeeded];
}

4
Bạn cũng có thể cập nhật các ràng buộc trong 'textViewDidChange:' của UITextViewDelegate
LK__

2
Giải pháp tốt đẹp. Lưu ý rằng bạn cũng có thể tạo ràng buộc trong Trình tạo giao diện và kết nối nó bằng ổ cắm. Kết hợp với việc sử dụng textViewDidChangenày sẽ tiết kiệm được một số phân lớp rắc rối và viết mã
Rỏ

3
Hãy nhớ rằng textViewDidChange:sẽ không được gọi khi thêm văn bản vào UITextView theo chương trình.
lang thang

Đề xuất @BobVork hoạt động tốt XCODE 11 / iOS13, đặt hằng số ràng buộc khi giá trị chế độ xem văn bản được đặt trong viewWillAppear và cập nhật trong textViewDidChange.
ptc

549

Tóm tắt: Vô hiệu hóa cuộn của chế độ xem văn bản của bạn và không hạn chế chiều cao của nó.

Để thực hiện việc này theo chương trình, hãy đặt đoạn mã sau vào viewDidLoad:

let textView = UITextView(frame: .zero, textContainer: nil)
textView.backgroundColor = .yellow // visual debugging
textView.isScrollEnabled = false   // causes expanding height
view.addSubview(textView)

// Auto Layout
textView.translatesAutoresizingMaskIntoConstraints = false
let safeArea = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
    textView.topAnchor.constraint(equalTo: safeArea.topAnchor),
    textView.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor),
    textView.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor)
])

Để thực hiện việc này trong Trình tạo giao diện, hãy chọn chế độ xem văn bản, bỏ chọn Cuộn được bật trong Trình kiểm tra thuộc tính và thêm các ràng buộc theo cách thủ công.

Lưu ý: Nếu bạn có chế độ xem / s khác ở trên / bên dưới chế độ xem văn bản của mình, hãy xem xét sử dụng a UIStackViewđể sắp xếp tất cả.


12
Hoạt động với tôi (iOS 7 @ xcode 5). Thông báo trước là chỉ cần bỏ chọn "cuộn cho phép" trong IB sẽ không giúp ích. Bạn phải lập trình làm điều đó.
Kenneth Jiang

10
Làm cách nào để đặt chiều cao tối đa trên chế độ xem văn bản và sau đó lấy chế độ xem văn bản để cuộn sau khi nội dung của nó vượt quá chiều cao của chế độ xem văn bản?
ma11hew28

3
@iOSGeek chỉ cần tạo một lớp con UITextView và ghi đè intrinsicContentSizenhư thế này - (CGSize)intrinsicContentSize { CGSize size = [super intrinsicContentSize]; if (self.text.length == 0) { size.height = UIViewNoIntrinsicMetric; } return size; }. Hãy cho tôi biết nếu nó làm việc cho bạn. Không tự mình kiểm tra.
manuelwaldner

1
Đặt thuộc tính này và đặt UITextView trong UIStackView. Voilla - tự thay đổi kích thước văn bản!)
Nik Kov

3
Câu trả lời này là vàng. Với Xcode 9, nó cũng hoạt động nếu bạn tắt hộp kiểm trong IB.
sinh

48

Đây là một giải pháp cho những người thích làm tất cả bằng cách bố trí tự động:

Trong thanh tra kích thước:

  1. Đặt mức độ ưu tiên nén nội dung theo chiều dọc thành 1000.

  2. Hạ mức độ ưu tiên của chiều cao ràng buộc bằng cách nhấp vào "Chỉnh sửa" trong Ràng buộc. Chỉ cần làm cho nó ít hơn 1000.

nhập mô tả hình ảnh ở đây

Trong thanh tra thuộc tính:

  1. Bỏ chọn "Đã bật cuộn"

Điều này đang làm việc hoàn hảo. Tôi đã không đặt chiều cao. Chỉ cần tăng mức độ ưu tiên của khả năng chịu nén dọc của UItextview lên 1000. UItextView có một số nội dung, đó là lý do tại sao tự động thanh toán bị lỗi vì UItextview sẽ cần ít nhất 32 chiều cao, ngay cả khi không có nội dung nào trong đó, khi cuộn bị tắt.
nr5

Cập nhật: Yêu cầu hạn chế chiều cao nếu bạn muốn chiều cao tối thiểu là 20 hoặc bất cứ điều gì khác. 32 khôn ngoan khác sẽ được coi là chiều cao tối thiểu.
nr5

@Nil Vui mừng khi nghe nó giúp.
Michael Revlis

@MichaelRevlis, Điều này hoạt động rất tốt. nhưng khi có một văn bản lớn thì văn bản không hiển thị. bạn có thể chọn văn bản để xử lý khác nhưng nó không hiển thị. bạn có thể vui lòng giúp tôi với điều đó ? nó xảy ra khi tôi bỏ chọn tùy chọn kích hoạt cuộn. Khi tôi bật tính năng cuộn textview thì nó sẽ hiển thị hoàn hảo nhưng tôi muốn xem văn bản không cuộn.
Bhautik Ziniya

@BhautikZiniya, bạn đã thử xây dựng ứng dụng của mình trên một thiết bị thực sự chưa? Tôi nghĩ rằng nó có thể là một trình giả lập hiển thị lỗi. Tôi có một UITextView với cỡ chữ văn bản 100. Nó được hiển thị tốt trên một thiết bị thực nhưng văn bản thì vô hình trên một trình giả lập.
Michael Revlis

38

UITextView không cung cấp một intinsicContentSize, vì vậy bạn cần phải phân lớp nó và cung cấp một cái. Để làm cho nó phát triển tự động, vô hiệu hóa intinsicContentSize trong layoutSubview. Nếu bạn sử dụng bất cứ thứ gì ngoài nội dung mặc định (mà tôi không khuyến nghị), bạn có thể cần phải điều chỉnh phép tính intinsicContentSize.

@interface AutoTextView : UITextView

@end

#import "AutoTextView.h"

@implementation AutoTextView

- (void) layoutSubviews
{
    [super layoutSubviews];

    if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
        [self invalidateIntrinsicContentSize];
    }
}

- (CGSize)intrinsicContentSize
{
    CGSize intrinsicContentSize = self.contentSize;

    // iOS 7.0+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
        intrinsicContentSize.width += (self.textContainerInset.left + self.textContainerInset.right ) / 2.0f;
        intrinsicContentSize.height += (self.textContainerInset.top + self.textContainerInset.bottom) / 2.0f;
    }

    return intrinsicContentSize;
}

@end

1
Điều này làm việc tốt cho tôi. Ngoài ra, tôi sẽ đặt 'scrollEnables' thành NO trong Trình tạo giao diện cho Chế độ xem văn bản này, vì nó đã hiển thị tất cả nội dung của nó mà không cần cuộn. Quan trọng hơn, nếu nó nằm trong chế độ xem cuộn thực tế, bạn có thể trải nghiệm con trỏ nhảy gần cuối chế độ xem văn bản, nếu bạn không tắt cuộn trên chế độ xem văn bản.
idstar

Điều này hoạt động độc đáo. Thật thú vị khi ghi đè setScrollEnabled:để luôn đặt nó thành NObạn sẽ có một vòng lặp vô hạn cho kích thước nội dung nội tại ngày càng tăng.
Pascal

Trên iOS 7.0, tôi cũng cần thiết để gọi [textView sizeToFit]trong textViewDidChange:callback đại biểu cho Auto Layout để phát triển hoặc thu nhỏ TextView (và tính toán lại bất kỳ hạn chế phụ thuộc) sau mỗi lần gõ phím.
dõi

6
Điều này dường như không còn cần thiết trong iOS 7.1 Để khắc phục và cung cấp khả năng tương thích ngược, hãy bọc điều kiện -(void)layoutSubviewsvà bọc tất cả-(CGSize)intrinsicContentSizebằng version >= 7.0f && version < 7.1f+else return [super intrinsicContentSize];
David James

1
@DavidJames điều này vẫn cần thiết trong ios 7.1.2, tôi không biết bạn đang thử nghiệm ở đâu.
Softlion

28

Bạn có thể làm điều đó thông qua bảng phân cảnh, chỉ cần tắt "Cuộn kích hoạt" :)

Câu chuyện


2
Câu trả lời hay nhất cho câu hỏi này
Ivan Byelko

Đây là giải pháp tốt nhất khi bạn làm việc với Auto Layout.
JanApotheker

1
Cài đặt bố cục tự động (Hàng đầu, Trailing, Trên, Dưới, KHÔNG Chiều cao / Chiều rộng ) + Vô hiệu hóa cuộn. Và ở đó bạn đi. Cảm ơn!
Farhan Arshad

15

Tôi thấy rằng nó không hoàn toàn không phổ biến trong các tình huống mà bạn vẫn có thể cần isScrollEnables được đặt thành true để cho phép tương tác UI hợp lý. Một trường hợp đơn giản cho điều này là khi bạn muốn cho phép tự động mở rộng chế độ xem văn bản nhưng vẫn giới hạn chiều cao tối đa của nó ở mức hợp lý trong UITableView.

Đây là một lớp con của UITextView Tôi đã đưa ra cho phép mở rộng tự động với bố cục tự động nhưng bạn vẫn có thể giới hạn ở độ cao tối đa và sẽ quản lý xem chế độ xem có thể cuộn được hay không tùy thuộc vào độ cao. Theo mặc định, chế độ xem sẽ mở rộng vô tận nếu bạn thiết lập các ràng buộc theo cách đó.

import UIKit

class FlexibleTextView: UITextView {
    // limit the height of expansion per intrinsicContentSize
    var maxHeight: CGFloat = 0.0
    private let placeholderTextView: UITextView = {
        let tv = UITextView()

        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.backgroundColor = .clear
        tv.isScrollEnabled = false
        tv.textColor = .disabledTextColor
        tv.isUserInteractionEnabled = false
        return tv
    }()
    var placeholder: String? {
        get {
            return placeholderTextView.text
        }
        set {
            placeholderTextView.text = newValue
        }
    }

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        isScrollEnabled = false
        autoresizingMask = [.flexibleWidth, .flexibleHeight]
        NotificationCenter.default.addObserver(self, selector: #selector(UITextInputDelegate.textDidChange(_:)), name: Notification.Name.UITextViewTextDidChange, object: self)
        placeholderTextView.font = font
        addSubview(placeholderTextView)

        NSLayoutConstraint.activate([
            placeholderTextView.leadingAnchor.constraint(equalTo: leadingAnchor),
            placeholderTextView.trailingAnchor.constraint(equalTo: trailingAnchor),
            placeholderTextView.topAnchor.constraint(equalTo: topAnchor),
            placeholderTextView.bottomAnchor.constraint(equalTo: bottomAnchor),
        ])
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var text: String! {
        didSet {
            invalidateIntrinsicContentSize()
            placeholderTextView.isHidden = !text.isEmpty
        }
    }

    override var font: UIFont? {
        didSet {
            placeholderTextView.font = font
            invalidateIntrinsicContentSize()
        }
    }

    override var contentInset: UIEdgeInsets {
        didSet {
            placeholderTextView.contentInset = contentInset
        }
    }

    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize

        if size.height == UIViewNoIntrinsicMetric {
            // force layout
            layoutManager.glyphRange(for: textContainer)
            size.height = layoutManager.usedRect(for: textContainer).height + textContainerInset.top + textContainerInset.bottom
        }

        if maxHeight > 0.0 && size.height > maxHeight {
            size.height = maxHeight

            if !isScrollEnabled {
                isScrollEnabled = true
            }
        } else if isScrollEnabled {
            isScrollEnabled = false
        }

        return size
    }

    @objc private func textDidChange(_ note: Notification) {
        // needed incase isScrollEnabled is set to true which stops automatically calling invalidateIntrinsicContentSize()
        invalidateIntrinsicContentSize()
        placeholderTextView.isHidden = !text.isEmpty
    }
}

Là một phần thưởng, có hỗ trợ cho việc bao gồm văn bản giữ chỗ tương tự như UILabel.


7

Bạn cũng có thể làm điều đó mà không cần phân lớp UITextView. Hãy xem câu trả lời của tôi về Làm cách nào để tôi định cỡ UITextView cho nội dung của nó trên iOS 7?

Sử dụng giá trị của biểu thức này:

[textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height

để cập nhật constantcủa textViewchiều cao 's UILayoutConstraint.


3
Bạn đang làm điều này ở đâu và bạn có đang làm gì khác để đảm bảo UITextView đã được thiết lập không? Tôi đang làm điều này và bản thân văn bản xem kích thước, nhưng bản thân văn bản bị cắt đi một nửa chiều cao của UITextView. Văn bản được đặt theo chương trình ngay trước khi thực hiện công việc của bạn ở trên.
chadbag

Tôi thấy điều này thường hữu ích hơn so với thủ thuật scrollEnables = NO, nếu bạn muốn đặt độ rộng bằng tay.
jchnxu

3

Một điều quan trọng cần lưu ý:

Vì UITextView là một lớp con của UIScrollView, nên nó phải tuân theo thuộc tính tự độngAdAdScScViewViewInsets của UIViewControll.

Nếu bạn đang thiết lập bố cục và TextView là khung nhìn phụ đầu tiên trong hệ thống phân cấp của UIViewControllers, nó sẽ có nội dung được sửa đổi nếu tự độngAdAdScScecViewViewsets thực sự gây ra hành vi không mong muốn trong bố cục tự động.

Vì vậy, nếu bạn gặp vấn đề với bố cục tự động và chế độ xem văn bản, hãy thử cài đặt automaticallyAdjustsScrollViewInsets = falsetrên bộ điều khiển chế độ xem hoặc di chuyển textView về phía trước trong cấu trúc phân cấp.


2

Đây là một nhận xét rất quan trọng

Chìa khóa để hiểu tại sao câu trả lời của vitaminwater có ba điều:

  1. Biết rằng UITextView là một lớp con của lớp UIScrollView
  2. Hiểu cách ScrollView hoạt động và cách tính nội dung của nó. Để biết thêm xem điều này ở đây câu trả lời và các giải pháp và ý kiến ​​khác nhau của nó.
  3. Hiểu nội dung kích thước là gì và cách tính của nó. Xem ở đâyở đây . Nó cũng có thể giúp thiết lập đó contentOffsetkhả năng gì ngoài:

func setContentOffset(offset: CGPoint)
{
    CGRect bounds = self.bounds
    bounds.origin = offset
    self.bounds = bounds
}

Để biết thêm xem cuộn objchiểu cuộn


Kết hợp cả ba lại với nhau, bạn sẽ dễ dàng hiểu rằng bạn cần cho phép nội dung bên trong của TextView hoạt động theo các ràng buộc AutoLayout của textView để điều khiển logic. Gần như thể văn bản của bạn đang hoạt động giống như một UILabel

Để thực hiện điều đó, bạn cần phải vô hiệu hóa cuộn, điều đó có nghĩa là kích thước của scrollView, kích thước của contentSize và trong trường hợp thêm một containerView, thì kích thước của containerView sẽ giống nhau. Khi chúng giống nhau, bạn KHÔNG có cuộn. Và bạn sẽ có . Có nghĩa là bạn không cuộn xuống. Thậm chí không được 1 điểm! Kết quả là textView sẽ được kéo dài ra.0 contentOffset0 contentOffSet

Nó cũng không có giá trị gì có nghĩa là giới hạn và khung của scrollView giống hệt nhau. Nếu bạn cuộn xuống 5 điểm thì nội dung của bạn sẽ là , trong khi của bạn sẽ bằng0 contentOffset5scrollView.bounds.origin.y - scrollView.frame.origin.y5


1

Giải pháp cắm và chạy - Xcode 9

Autolayout giống như UILabel, với sự liên kết phát hiện , lựa chọn văn bản , chỉnh sửadi chuyển của UITextView.

Tự động xử lý

  • Khu vực an toàn
  • Nội dung
  • Dòng đệm
  • Bộ chứa văn bản
  • Những ràng buộc
  • Lượt xem ngăn xếp
  • Chuỗi được quy
  • Bất cứ điều gì.

Rất nhiều câu trả lời trong số đó đã đưa tôi 90% ở đó, nhưng không có câu trả lời nào là ngu ngốc.

Thả vào UITextViewlớp con này và bạn tốt.


#pragma mark - Init

- (instancetype)initWithFrame:(CGRect)frame textContainer:(nullable NSTextContainer *)textContainer
{
    self = [super initWithFrame:frame textContainer:textContainer];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit
{
    // Try to use max width, like UILabel
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
    
    // Optional -- Enable / disable scroll & edit ability
    self.editable = YES;
    self.scrollEnabled = YES;
    
    // Optional -- match padding of UILabel
    self.textContainer.lineFragmentPadding = 0.0;
    self.textContainerInset = UIEdgeInsetsZero;
    
    // Optional -- for selecting text and links
    self.selectable = YES;
    self.dataDetectorTypes = UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber | UIDataDetectorTypeAddress;
}

#pragma mark - Layout

- (CGFloat)widthPadding
{
    CGFloat extraWidth = self.textContainer.lineFragmentPadding * 2.0;
    extraWidth +=  self.textContainerInset.left + self.textContainerInset.right;
    if (@available(iOS 11.0, *)) {
        extraWidth += self.adjustedContentInset.left + self.adjustedContentInset.right;
    } else {
        extraWidth += self.contentInset.left + self.contentInset.right;
    }
    return extraWidth;
}

- (CGFloat)heightPadding
{
    CGFloat extraHeight = self.textContainerInset.top + self.textContainerInset.bottom;
    if (@available(iOS 11.0, *)) {
        extraHeight += self.adjustedContentInset.top + self.adjustedContentInset.bottom;
    } else {
        extraHeight += self.contentInset.top + self.contentInset.bottom;
    }
    return extraHeight;
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    
    // Prevents flashing of frame change
    if (CGSizeEqualToSize(self.bounds.size, self.intrinsicContentSize) == NO) {
        [self invalidateIntrinsicContentSize];
    }
    
    // Fix offset error from insets & safe area
    
    CGFloat textWidth = self.bounds.size.width - [self widthPadding];
    CGFloat textHeight = self.bounds.size.height - [self heightPadding];
    if (self.contentSize.width <= textWidth && self.contentSize.height <= textHeight) {
        
        CGPoint offset = CGPointMake(-self.contentInset.left, -self.contentInset.top);
        if (@available(iOS 11.0, *)) {
            offset = CGPointMake(-self.adjustedContentInset.left, -self.adjustedContentInset.top);
        }
        if (CGPointEqualToPoint(self.contentOffset, offset) == NO) {
            self.contentOffset = offset;
        }
    }
}

- (CGSize)intrinsicContentSize
{
    if (self.attributedText.length == 0) {
        return CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
    }
    
    CGRect rect = [self.attributedText boundingRectWithSize:CGSizeMake(self.bounds.size.width - [self widthPadding], CGFLOAT_MAX)
                                                    options:NSStringDrawingUsesLineFragmentOrigin
                                                    context:nil];
    
    return CGSizeMake(ceil(rect.size.width + [self widthPadding]),
                      ceil(rect.size.height + [self heightPadding]));
}

0

Câu trả lời của vitaminwater đang làm việc cho tôi.

Nếu văn bản của chế độ xem văn bản của bạn bị nảy lên và xuống trong khi chỉnh sửa, sau khi cài đặt [textView setScrollEnabled:NO];, hãy đặt Size Inspector > Scroll View > Content Insets > Never.

Hy vọng nó giúp.


0

Đặt UILabel ẩn bên dưới văn bản của bạn. Các dòng nhãn = 0. Đặt các ràng buộc của UITextView bằng với UILabel (centreX, centre, width, height). Hoạt động ngay cả khi bạn để lại hành vi cuộn của textView.


-1

BTW, tôi đã xây dựng một UITextView mở rộng bằng cách sử dụng một lớp con và ghi đè kích thước nội dung nội tại. Tôi đã phát hiện ra một lỗi trong UITextView mà bạn có thể muốn điều tra trong quá trình thực hiện của riêng bạn. Đây là vấn đề:

Chế độ xem văn bản mở rộng sẽ phát triển xuống để phù hợp với văn bản đang phát triển nếu bạn nhập từng chữ cái một. Nhưng nếu bạn dán một loạt văn bản vào đó, nó sẽ không phát triển xuống mà văn bản sẽ cuộn lên và văn bản ở trên cùng nằm ngoài tầm nhìn.

Giải pháp: Ghi đè setBound: trong lớp con của bạn. Vì một số lý do không rõ, việc dán đã khiến giá trị của bound.origin.y không phải là zee (33 trong mọi trường hợp mà tôi thấy). Vì vậy, tôi áp đảo setBound: để luôn đặt giới hạn.origin.y thành zero. Đã khắc phục sự cố.


-1

Đây là một giải pháp nhanh chóng:

Sự cố này có thể xảy ra nếu bạn đã đặt thuộc tính clipToBound thành false của chế độ xem văn bản của bạn. Nếu bạn chỉ cần xóa nó, vấn đề sẽ biến mất.

myTextView.clipsToBounds = false //delete this line

-3
Obj C:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic) UITextView *textView;
@end



#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize textView;

- (void)viewDidLoad{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor grayColor]];
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(30,10,250,20)];
    self.textView.delegate = self;
    [self.view addSubview:self.textView];
}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
}

- (void)textViewDidChange:(UITextView *)txtView{
    float height = txtView.contentSize.height;
    [UITextView beginAnimations:nil context:nil];
    [UITextView setAnimationDuration:0.5];

    CGRect frame = txtView.frame;
    frame.size.height = height + 10.0; //Give it some padding
    txtView.frame = frame;
    [UITextView commitAnimations];
}

@end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.