2012-11-21 19 views
10

Tôi đang tạo một mục nhận xét giống như phần Facebook sử dụng cho phần nhắn tin trong ứng dụng iOS của nó. Tôi muốn các UITextView để thay đổi kích thước chiều cao để văn bản tôi gõ phù hợp với bên trong nó hơn là bạn phải di chuyển để xem văn bản tràn. Bất kỳ ý tưởng làm thế nào tôi có thể đi về việc này? Tôi đã nhìn vào có thể sử dụng một CGRect được gán cho kích thước và chiều cao của độ xem văn bản mà sau đó phù hợp với kích thước nội dung:Làm thế nào để thay đổi kích thước UITextView trong khi gõ bên trong nó?

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

Tôi giả sử tôi cần một số loại chức năng phát hiện khi văn bản đạt đến giới hạn của UITextView và sau đó thay đổi kích thước chiều cao của chế độ xem? Có ai đấu tranh với khái niệm này không?

+0

Bạn có thể tìm thấy giải pháp làm việc chi tiết [ở đây] (http://stackoverflow.com/a/37633816/2066428) – malex

Trả lời

20

Bạn có thể điều chỉnh khung theo phương thức ủy nhiệm này, đừng quên đặt đại biểu của TextView thành tự.

-(BOOL)textView:(UITextView *)_textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
     [self adjustFrames]; 
     return YES; 
} 


-(void) adjustFrames 
{ 
    CGRect textFrame = textView.frame; 
    textFrame.size.height = textView.contentSize.height; 
    textView.frame = textFrame; 
} 

giải pháp này là dành cho iOS6 và các năm trước ... cho iOS7 tham khảo này

StackOverflow Answer

+0

Oh really? Tôi không nghĩ rằng nó sẽ được đơn giản .. ok cảm ơn tôi sẽ cho rằng một đi! – Ollie177

+0

Điều đó hoạt động rất tốt nhờ sự giúp đỡ của bạn! – Ollie177

+3

Tính năng này không hoạt động trên iOS 7.0 – Stavash

1

contentsize sẽ không làm việc trong ios 7. Hãy thử điều này:

CGFloat textViewContentHeight = textView.contentSize.height; 

textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9); 
+4

tại sao số ma thuật? – vvMINOvv

6

Đây là giải pháp của tôi, sử dụng autolayouttextView.contentSize.height. Thử nghiệm trên iOS8 Xcode6.3 beta4.

Có một lần nắm bắt về số setContentOffset ở cuối. Tôi đặt nó để tránh hiện tượng "sai contentOffset" khi thay đổi số lượng dòng. Nó thêm một khoảng trống thừa không mong muốn bên dưới dòng cuối cùng và nó trông không đẹp lắm trừ khi bạn thiết lập lại nó ngay sau khi thay đổi ràng buộc. Đã cho tôi giờ để tìm ra điều này!

// set this up somewhere 
let minTextViewHeight: CGFloat = 32 
let maxTextViewHeight: CGFloat = 64 

func textViewDidChange(textView: UITextView) { 

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal 

    if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height 
     height = minTextViewHeight 
    } 
    if (height > maxTextViewHeight) { // max cap 
     height = maxTextViewHeight 
    } 

    if height != textViewHeight.constant { // set when height changed 
     textViewHeight.constant = height // change the value of NSLayoutConstraint 
     textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes 
    } 
} 
+0

nơi 'textViewHeight' được khai báo? – lf215

+1

@ lf215 là đối tượng 'NSLayoutConstraint' cho chiều cao của UITextView. Tôi quên thêm xin lỗi. – Hlung

+0

Tôi khá mới mẻ với điều này. Bạn có thể vui lòng xây dựng/thêm mã để hiển thị làm thế nào để có được textViewHeight? – lf215

4

Trên TableViewController chứa UITextView, cập nhật dữ liệu từ tableViewDataSource đó được đưa vào tế bào và sau đó chỉ cần gọi đây là:

tableView.beginUpdates() 
    tableView.endUpdates() 

Không giống như tableView.reloadData(), điều này không gọi resignFirstResponder

+0

Điều này thật hoàn hảo! Cảm ơn. Ở đây giống nhau trong ObjC: '- (void) textViewDidChange: (UITextView *) textView {[self.tableView beginUpdates]; [self.tableView endUpdates]; } 'Bạn thậm chí có được hình ảnh động miễn phí;) – Holtwick

2

Đầu tiên thiết lập các hạn chế chiều cao tối thiểu để TextView của bạn:

textView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor, multiplier: 0.20) 

(Hãy chắc chắn rằng bạn đang thiết greaterThanOrEqualTo Hạn chế để nếu chiều cao nội dung thực chất là hơn chiều cao này, phải mất chiều cao nội dung bên trong)

HOẶC đơn giản liên tục

textView.heightAnchor.constraint(greaterThanOrEqualToConstant: someConstant) 

Trong khi cấu hình TextView của mình, thiết lập isScrollEnabled để false

textView.isScrollEnabled = false 

Bây giờ khi bạn gõ vào textView, chiều cao nội dung nội tại của nó sẽ tăng lên và sẽ tự động đẩy chế độ xem bên dưới.