2013-10-01 20 views
15

Tôi có UITextView trong ứng dụng của mình. Tôi cần phải thay đổi nó nội dung bù đắp động mỗi khi một chuỗi mới được nối thêm. Mã dưới đây hoạt động tốt trên iOS 6 và các phiên bản cũ hơn, nhưng không hoạt động trên iOS 7.Nội dung UITextViewĐặt trên iOS 7

CGPoint offset = CGPointMake(0, self.textView.contentSize.height - self.textView.frame.size.height); 
[self.textView setContentOffset:bottomOffset animated:YES]; 

Bạn có ý tưởng gì không?

Hơn bạn.

CẬP NHẬT

Các UITextView không đặt contentOffset của nó như nó phải, hay cái gì khác lộn xộn nó lên. Kết quả là không như mong đợi (nó như thế nào trên iOS 6 hoặc các phiên bản cũ hơn).

Tôi cũng đã cố gắng thiết lập thuộc tính mới "textContainerInset" nhưng vẫn không có kết quả ...

self.textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)  

CẬP NHẬT

Như tôi đã có thể nhìn thấy trong phương pháp đại biểu didScroll, khi tôi vượt qua một giá trị dương cho bù đắp nội dung, nó cuộn đến (0,0). Ví dụ, tôi đặt nội dung bù đắp cho (0,35) và nó cuộn đến (0,0) ...

+0

Tôi đã cập nhật bài đăng của mình. –

Trả lời

4

Ok, dựa trên nghiên cứu của tôi và các câu trả lời khác, vấn đề là chiều cao nội dung của UITextView và không di chuyển đến độ lệch cụ thể. Đây là một giải pháp mà hoạt động theo cách nó nên làm việc cho iOS 7:

Trước tiên, bạn cần phải tạo lại UITextView như thế này:

NSString *reqSysVer = @"7.0"; 
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending); 

    if (osVersionSupported) { 

     NSLog(@"reset chatoutput"); 

     CGRect outputFrame = self.chatOutput.frame; 

     [chatOutput removeFromSuperview]; 
     [chatOutput release]; 
     chatOutput = nil; 

     NSTextStorage* textStorage = [[NSTextStorage alloc] init]; 
     NSLayoutManager* layoutManager = [NSLayoutManager new]; 
     [textStorage addLayoutManager:layoutManager]; 
     NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.view.bounds.size]; 
     [layoutManager addTextContainer:textContainer]; 
     chatOutput = [[UITextView alloc] initWithFrame: outputFrame 
              textContainer: textContainer]; 
     // if using ARC, remove these 3 lines 
     [textContainer release]; 
     [layoutManager release]; 
     [textStorage release]; 

     [self.view addSubview: chatOutput]; 
    } 

Sau đó, sử dụng phương pháp này để có được chiều cao UITextView nội dung:

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width 
{ 
    UITextView *calculationView = [[UITextView alloc] init]; 
    [calculationView setAttributedText:text]; 
    CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)]; 

    NSLog(@"size: %f", size.height) ; 

    return size.height; 
} 

Bây giờ bạn có thể thiết lập các nội dung offset:

CGPoint bottomOffset; 

bottomOffset = CGPointMake(0, [self textViewHeightForAttributedText: self.chatOutput.attributedText andWidth: self.chatOutput.frame.size.width] - self.chatOutput.frame.size.height); 

[self.chatOutput setContentOffset:bottomOffset animated:YES]; 

CẬP NHẬT

Tôi đã đọc trong Tài liệu Apple cho NSAttributedString: "Phông chữ mặc định cho các đối tượng NSAttributedString là Helvetica 12 điểm, trong đó có thể khác với font hệ thống mặc định cho nền tảng này."

Kết luận, nếu bạn sử dụng các phông chữ khác nhau có kích cỡ khác nhau, bạn cũng phải đặt phông chữ đó cho ví dụ NSAttributeString.Nếu không, chiều cao trả lại sẽ không tương ứng với mong đợi của bạn. Bạn có thể muốn sử dụng một cái gì đó như thế này:

NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject: [UIFont systemFontOfSize: 18.0] //or any other font or size 
                   forKey: NSFontAttributeName]; 
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString: currentPost.postMessageText attributes: attrsDictionary]; 
    frame.size.height = [self textViewHeightForAttributedText: attributedString andWidth: 280.0]; 
    [attributedString release]; 
+0

Hoạt động như một sự quyến rũ. Làm tốt lắm :) –

6

Các giải pháp tôi đã tìm thấy không phải là thanh lịch ở tất cả, nhưng nó hoạt động:

Tôi đặt contentOffset của UITextView thành (0,0) trước khi đặt nó thành giá trị offset mong muốn. Tôi không biết tại sao nó hoạt động, nhưng bây giờ là giải pháp tốt nhất mà tôi đã tìm thấy.

CGPoint bottomOffset = CGPointMake(0, self.textView.contentSize.height - self.textView.frame.size.height); 
[self.textView setContentOffset: CGPointMake(0,0) animated:NO]; 
[self.textView setContentOffset:bottomOffset animated:YES]; 
+3

Nó không hoạt động cho tôi. Tôi có cùng một vấn đề –

+0

Điều này làm việc tuyệt vời cho tôi trong iOS 9. Cảm ơn. – vaticRite

+0

Tác phẩm này nhưng tôi không muốn hoạt ảnh –

0

Tôi đã phải nhờ đến

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

nhưng vấn đề BIG với nó là nó bắt đầu từ phía trên cùng của văn bản và cuộn đến cùng mỗi khi bạn thêm vào văn bản. Giải pháp của Mihai cũng vậy.

5

Tôi vừa nhận thấy rằng hôm nay. Trong trường hợp của tôi, vấn đề dường như liên quan đến Chế độ xem văn bản là điều khiển đầu tiên trong chế độ xem. Tôi di chuyển nó đến vị trí thứ hai trong phác thảo tài liệu (sau khi một UILabel ví dụ) và bù đắp đã biến mất.

Hầu hết điều này có thể được thực hiện với mục đích vì thanh điều hướng hành vi mới trong iOS7.

+1

OMG !!!!! Đây là sửa chữa ngu ngốc nhất. Nhưng nó đã có tác dụng! Chỉ cần xảy ra để có một contentOffset trong UITextView của tôi của -64.0 –

+0

Cảm ơn bạn đã cứu chúng tôi vì một số gỡ lỗi đau đớn ... và lol apple – hhanesand

2

@ vidonism's answer hoạt động nhưng điều này thậm chí còn tốt hơn.

// in -viewDidLoad of UIViewController 
self.automaticallyAdjustsScrollViewInsets = NO; 

Xem thêm bình luận hàng đầu về câu trả lời được chấp nhận trên question này. Điều này có khả năng giải thích hành vi của UIScrollView là subView đầu tiên của khung nhìn chính của ViewController.
Tôi không thể khá thất vọng nếu đây là hành vi mong đợi hoặc lỗi.

+0

Cảm ơn bạn ... đây là loại câu trả lời tôi đang tìm kiếm, các công trình kỹ thuật, nhưng có không có khả năng phục hồi, hầu hết các nhận xét về chủ đề này sẽ không được chấp nhận trong các phiên bản iOS trong tương lai, không phải của bạn. Hoặc ít nhất nó sẽ trở thành không được chấp nhận với các lỗi biên dịch thời gian thay vì thiết kế không có thật và gỡ lỗi tẻ nhạt. –

0

Không có câu trả lời nào trước đây phù hợp với tôi, vì tôi có [textView setScrollEnabled:NO]. Vì vậy, tôi đã kết thúc với điều này:

[textView setScrollEnabled:YES] 
[self.text setContentOffset:CGPointMake(0, page * self.text.frame.size.height) animated:NO]; 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    [self.text setScrollEnabled:NO]; 
}); 
Các vấn đề liên quan