2012-07-04 35 views
5

Tôi có điều này hoạt động tuyệt vời ngoại trừ, tôi không thể nhận được văn bản bên trong UITextView để bắt đầu cuộn chỉ sau khi kích thước của UITextView gần đầy. UITextView có 4 dòng cao, nhưng ngay sau khi tôi đạt đến dòng thứ 2 dòng thứ nhất được đẩy lên, tôi không muốn chế độ xem bắt đầu cuộn cho đến khi tôi đạt đến dòng 5. scrollingEnabled = NO giữ cho nó không bị cuộn, do đó không hoạt động.Làm cách nào để có được UITextView chỉ cuộn khi có đầy đủ văn bản

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)]; 

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)]; 

barf_.layer.cornerRadius = 3.0f; 

barf_.layer.borderWidth = 0.5f; 

barf_.font = [UIFont fontWithName:@"Helvetica" size:13]; 

Trả lời

0

Bạn có thể sử dụng phương pháp sizeWithFont:constrainedToSize:lineBreakMode: để kiểm tra xem chuỗi của bạn có thực sự hiển thị lớn hơn chế độ xem văn bản hay không và xem bạn có cần bật cuộn hay không. Bạn sẽ phải gọi nó bất cứ lúc nào văn bản trong scrollview của bạn được thiết lập, tuy nhiên.

ví dụ:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
           constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
            lineBreakMode:UILineBreakModeWordWrap] 
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height] 
2

Khi UITextView của bạn được tải bộ scrollEnabled để NO. Sau đó thiết lập đại biểu độ xem văn bản để self hoặc một số đối tượng khác và thực hiện các phương pháp UITextViewDelegate

- (void)textViewDidChange:(UITextView *)textView 

Phương pháp này sẽ được gọi bất cứ lúc nào người dùng thực hiện một sự thay đổi cho văn bản bên trong xem. Bên trong phương pháp này, bạn cần phải tìm hiểu xem văn bản của bạn lớn đến mức nào và nếu nó vượt quá giới hạn của chế độ xem văn bản. Nếu vậy bạn bật cuộn. Sử dụng phương pháp này:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

Đây là phương pháp loại UIKit trên NSString. Nó trả về một CGSize sẽ cho bạn biết chiều cao của bất kỳ chuỗi văn bản nào bạn gọi nó. Trong trường hợp của bạn nó sẽ là một cái gì đó giống như

CGSize textSize = [textView.text sizeWithFont:textView.font 
          constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT) 
           lineBreakMode:UILineBreakModeWordWrap]; 
if (textSize.height > textView.frame.size.height) { 
    textView.scrollEnabled = YES; 
} else { 
    textView.scrollEnabled = NO; 
} 
2

Tôi tìm thấy câu trả lời, như những người khác với vấn đề tương tự có đề cập đến, với một TextView nhỏ, nó sẽ tự động thêm 32 padding để phía dưới.

Sửa lỗi đơn giản là thêm YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); bên trong phương thức shouldChangeTextInRange, đã khắc phục được sự cố của tôi!

2

Đặt contentInset có thể giúp văn bản xuất hiện chính xác hơn trong số UITextView. Tuy nhiên, nó sẽ không giúp giải quyết vấn đề theo đó UITextView đã bật tính năng cuộn mặc dù không có nhiều văn bản hơn để xem.

Tương tự, các phương pháp như sizeWithFont có giới hạn. Như được giải thích trong loạt blog tuyệt vời của Mike Weller iOS Development: You're Doing It Wrong, NSString không phải là một đối tượng tốt để hỏi về mức độ lớn của UIView. Nhiều lớp học UIView các lớp con như UILabel, UIButton, v.v. có insets và các cân nhắc khác phải được tính trong quá trình định cỡ. UITextLabel cũng không ngoại lệ.

mục cụ thể Mike Weller về đề tài này là:

You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]

iOS 7 hứa với chúng ta xử lý văn bản phức tạp hơn trong UITextView, với những đặc tính như textContainerInset. Nhưng phải làm gì trong thời gian chờ đợi?

Trước tiên, chúng tôi biết rằng UITextView là một phân lớp của UIScrollView.Do đó, quy tắc vàng rằng nếu contentSize lớn hơn thuộc tính bounds của chế độ xem, chế độ xem cuộn sẽ cuộn để chúng tôi có thể xem thêm nội dung.

Kiểm tra contentSize lần nữa bounds sẽ không hoạt động vì chúng tôi biết rằng UIScrollView đang tính xem có cuộn hay không dựa trên văn bản và câu trả lời sai cho chúng tôi.

Đây là nơi các giá trị điều chỉnh tùy ý đến để giải cứu! Đối với tôi, giá trị này là 17.f. Đối với bạn - tùy thuộc vào phông chữ của bạn - nó có thể khác nhau. Sau đó, chúng tôi kiểm soát và quyết định xem chúng tôi có cho phép chế độ xem cuộn để cuộn hay không:

static const CGFloat kArbritaryHeight = 17.f; 
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight; 
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds); 
BOOL tooMuchContent = adjustedContentHeight > boundsHeight; 

if (tooMuchContent) 
{ 
    myTextView.scrollEnabled = YES; 
} 
else 
{ 
    myTextView.scrollEnabled = NO; 
} 
Các vấn đề liên quan