UITextView внутри UIScrollView не прокручивается - Цель c - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь отобразить сообщение с динамической высотой, используя UITextView, но когда сообщение достаточно длинное, чтобы покрыть экран, я не получаю функцию прокрутки. Я перепробовал много онлайн-решений, но все не удалось. Я использую NSMutableAttributedString для форматирования моего текста.

Вот моя последняя попытка:

NSMutableAttributedString * attrStr = [[NSMutableAttributedString alloc] initWithData:[self.descString dataUsingEncoding:NSUTF8StringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];

    __block BOOL found = NO;
    [attrStr beginEditing];
    [attrStr enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrStr.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
        if (value) {
            UIFont *oldFont = (UIFont *)value;
            UIFont *newFont = [oldFont fontWithSize:16];
            [attrStr addAttribute:NSFontAttributeName value:newFont range:range];
            [attrStr addAttribute:NSForegroundColorAttributeName
                            value:[UIColor darkGrayColor]
                            range:range];

            found = YES;
        }
    }];
    if (!found) {
        // No font was found - do something else?
    }
    [attrStr endEditing];

CGRect labelSize = [attrStr boundingRectWithSize:CGSizeMake(self.view.frame.size.width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];



self.textviewHeight.constant = labelSize.size.height;

В Интерфейсном Разработчике я использовал UIScrollView, внутри него я поместил UIView, а внутри UIView я добавил UITextView. textviewHeight - ограничение высоты UITextView. Я не могу поверить, что такая простая вещь заняла у меня так много часов, и у меня до сих пор нет решения. Пожалуйста, помогите!


Другие решения, которые я попробовал и потерпели неудачу:

1

CGRect labelSize = [self.descString boundingRectWithSize:CGSizeMake(self.view.frame.size.width * 0.97, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil];

    self.descView.frame = CGRectMake(labelSize.origin.x,
                                    labelSize.origin.y,
                                    ceil(labelSize.size.width),
                                    ceil(labelSize.size.height));


    [self.descView sizeToFit];

2

CGRect labelSize = [attrStr boundingRectWithSize:CGSizeMake(self.view.frame.size.width * 0.97, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];

    CGRect frame = self.descView.frame;
    frame.size.height = labelSize.size.height;
    self.descView.frame = frame;

Я не против использования UILabel, если его проще реализовать.

1 Ответ

0 голосов
/ 25 августа 2018

Если я понимаю, что вы пытаетесь выполнить, вам не нужно выполнять какие-либо программные вычисления высоты.

Мое лучшее предположение заключается в том, что вы устанавливаете нижнее ограничение для TextView (которое не позволяет прокручивать его полное содержимое).

Попробуйте поместить TextView как подпредставление стандартного UIView и установить ведущие / конечные / нижние / верхние ограничения этого представления (для всей области, в которой вы хотите, чтобы TextView отображался), затем поместите TextView в это и установите ведущие / конечные / верхние NOT BOTTOM (я предполагаю, что вы хотите, чтобы он мог прокручивать по вертикали) ограничения, он будет жаловаться на отсутствие ограничения высоты / y, поэтому продолжайте и установите centerY равным вид, удерживающий его центрY (т. е. центр обзора по вертикали).

Я приложил пример того, как выглядит ограничение (я добавил представления выше и ниже просто для того, чтобы показать, что оно может быть ограничено областью на основе представления, содержащего его ограничения)

enter image description here

enter image description here

Ваш код приведен ниже с незначительными изменениями:

#import "ViewController.h"

@interface ViewController ()
@property (strong, nullable) IBOutlet UITextView *scrollingTextView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *reallyLongString = @"Really Long String here";
    // your code to adjust it below
    NSMutableAttributedString * attrStr = [[NSMutableAttributedString alloc] initWithData:[reallyLongString dataUsingEncoding:NSUTF8StringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];

    __block BOOL found = NO;
    [attrStr beginEditing];
    [attrStr enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrStr.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
        if (value) {
            UIFont *oldFont = (UIFont *)value;
            UIFont *newFont = [oldFont fontWithSize:23];
            [attrStr addAttribute:NSFontAttributeName value:newFont range:range];
            [attrStr addAttribute:NSForegroundColorAttributeName
                            value:[UIColor darkGrayColor]
                            range:range];

            found = YES;
        }
    }];
    if (!found) {
        // No font was found - do something else?
    }
    [attrStr endEditing];
    [self.scrollingTextView setAttributedText:attrStr];
    // Do any additional setup after loading the view, typically from a nib.
}


@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...