it-swarm.com.ru

UITextView переносит текст при сборке с iOS 7 SDK

У меня есть UITextView внутри UIScrollView, который прекрасно работал на iOS 6, построенном из xcode 4.x, однако теперь сборка с xcode 5 не работает должным образом, даже на iOS 6.

Проблема заключается в том, что текстовые переносы имеют ширину экрана, хотя UITextView и UIScrollView имеют большую ширину. Я использую этот код для определения новой ширины и высоты UITextView, и даже несмотря на то, что просмотр текста прокручивается влево/вправо, текст переносится так, как если бы ширина была только шириной экрана.

Спасибо

self.responceTextView.text = [NSString stringWithFormat:@"%@%@",_responceTextView.text,responce];
[self textViewDidChange:self.responceTextView];

- (void)textViewDidChange:(UITextView *)textView
{
    // Recalculate size of text field
    CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
    CGSize reqSize = [textView.text sizeWithFont:[UIFont fontWithName:@"Courier" size:12] constrainedToSize:maxSize lineBreakMode:NSLineBreakByClipping];

    self.responceTextView.frame = CGRectMake(0, 0, reqSize.width+16, reqSize.height+16);

    // Resize scroll view if needs to be smaller so text stays at top of screen
    CGFloat maxScrollHeight = maxScrollViewSize.size.height;
    if (self.responceTextView.frame.size.height < maxScrollHeight) {
        self.responceScrollView.frame = CGRectMake(self.responceScrollView.frame.Origin.x, self.responceScrollView.frame.Origin.y, self.responceScrollView.frame.size.width, self.responceTextView.frame.size.height);
    } else {
        self.responceScrollView.frame = maxScrollViewSize;
    }

    // Set content size
    self.responceScrollView.contentSize = CGSizeMake(self.responceTextView.frame.size.width, self.responceTextView.frame.size.height);

    [self scrollToCursor];
}

Правка ----

Итак, похоже, sizeWithFont устарела в iOS 7. Странно, как я не получаю предупреждения компилятора. По-прежнему не имеет смысла, что он не работает на iOS 6 (или он полностью удален при сборке с iOS 7 SDK?)

Я перепробовал эти 2 варианта, но получил одинаковый размер от всех.

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIFont fontWithName:@"Courier" size:12], NSFontAttributeName,
                                nil];
CGRect rect = [textView.text boundingRectWithSize:maxSize options:NSLineBreakByClipping | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil];

возвращает: {{0, 0}, {439.27148, 168}}

CGSize rect2 = [textView.text sizeWithAttributes:attributes];

возвращает: {439.27148, 168}

И оригинал выше возвращает {439.27148, 168}

Все они должны вернуть более широкий взгляд.

РЕДАКТИРОВАТЬ 2 ---- Сверху кажется, что возвращенный фрейм правильный (шириной 439), однако это текст, который все еще находится в Word, внутри текстового представления.

10
Darren

попробуйте использовать:

[textView.text boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                           attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil];

Измерение струн кажется довольно глючным. Это единственная комбинация опций, которая дает правильный размер для проведенного мной тестирования.

Я успешно использую следующий код в iOS7 (это UITextField с минимальной и максимальной высотой. Когда высота текста становится больше, чем MAX_HEIGHT_MESSAGE_TEXTBOX, в UITextField появляются полосы прокрутки).

const float MAX_HEIGHT_MESSAGE_TEXTBOX = 80;
const float MIN_HEIGHT_MESSAGE_TEXTBOX = 30;


- (void)setFrameToTextSize:(CGRect)txtFrame textView:(UITextView *)textView
{

    if(txtFrame.size.height > MAX_HEIGHT_MESSAGE_TEXTBOX)
    {
        //OK, the new frame is to large. Let's use scroll
        txtFrame.size.height = MAX_HEIGHT_MESSAGE_TEXTBOX;
        textView.scrollEnabled = YES;
        [textView scrollRangeToVisible:NSMakeRange([textView.text length], 0)];
    }
    else
    {
        if (textView.frame.size.height < MIN_HEIGHT_MESSAGE_TEXTBOX) {
             //OK, the new frame is to small. Let's set minimum size
            txtFrame.size.height = MIN_HEIGHT_MESSAGE_TEXTBOX;
        }
        //no need for scroll
        textView.scrollEnabled = NO;
    }
    //set the frame
    textView.frame = txtFrame;
}

- (void)setframeToTextSize:(UITextView *)textView animated:(BOOL)animated
{
    //get current height
    CGRect txtFrame = textView.frame;

    //calculate height needed with selected font. Note the options.
    //append a new line to make space for the cursor after user hit the return key
    txtFrame.size.height =[[NSString stringWithFormat:@"%@\n ",textView.text]
                           boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                           attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil].size.height;

    if (animated) {
        //set the new frame, animated for a more Nice transition
        [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut |UIViewAnimationOptionAllowAnimatedContent animations:^{
            [self setFrameToTextSize:txtFrame textView:textView];
        } completion:nil];
    }
    else
    {
        [self setFrameToTextSize:txtFrame textView:textView];
    }
}

- (void)textViewDidChange:(UITextView *)textView
{
    [self setframeToTextSize:textView animated:YES];
}

РЕДАКТИРОВАТЬ

Когда измерение строки правильное, вам может потребоваться изменить lineBreakMode в textContainer UITextView. (NSTextContainer - новый класс в iOS7, содержащий информацию о том, как должен быть размечен текст):

textView.textContainer.lineBreakMode = NSLineBreakByCharWrapping; // default is NSLineBreakByWordWrapping 

Удачи!

18
EsbenB

метод sizeWithFont:(UIFont *)font constrainedToSize ..." устарел в iOS 7.

Это будет функционировать правильно.

Проверьте его альтернативу в iOS 7

Метод экземпляра NSString

-(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:

(NSDictionary *)attributes context:(NSStringDrawingContext *)context

Проверьте этот ответ. Замена устаревшего sizeWithFont: в iOS 7?

2
idris

Я думаю, что вы хотите рассчитать размер содержимого, чтобы вы могли увеличить размер содержимого просмотра прокрутки тоже. если да, воспользуйтесь этой ссылкой https://stackoverflow.com/a/19152955/102308

0
Shreesh Garg

для ответа на "Спасибо, но это, кажется, не решает мою проблему. Я использую гибкую ширину и высоту. Кажется, что я получаю правильные размеры, возвращаемые, поскольку textview прокручивает достаточно в обоих направлениях, однако сам текст все еще завернутый в ".

Я исправил это с помощью [textView sizeToFit];

0
user2868695