2015-06-07 3 views
1

Мое приложение настроено так.Как изменить шрифт в NSTextContainer

Пользовательский UIView внутри ScrollView.

Пользовательский UIView получает текст, сгенерированный поверх него этим кодом.

CoreDavening.mничьей функции

attStorage = [[NSTextStorage alloc]initWithAttributedString:string]; 

textContainer = [[NSTextContainer alloc] 
            initWithSize:CGSizeMake(self.frame.size.width, FLT_MAX)]; 

layoutManager = [[NSLayoutManager alloc]init]; 
[layoutManager addTextContainer:textContainer]; 
[attStorage addLayoutManager:layoutManager]; 

NSRange glyphRange = [layoutManager 
         glyphRangeForTextContainer:textContainer]; 
[layoutManager drawGlyphsForGlyphRange: glyphRange atPoint: rect.origin]; 

В моей ViewController.m Я создаю представление, как это.

CoreDavening *davenView = [[CoreDavening alloc]initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, [coreDavening heightForStringDrawing])]; 

    davenView.backgroundColor = [UIColor whiteColor]; 
    davenView.layer.borderColor = [[UIColor whiteColor]CGColor]; 
    scrollView.backgroundColor = [UIColor whiteColor]; 
    [scrollView addSubview:davenView]; 
    self.scrollView.contentSize = davenView.frame.size; 

Im пытаясь найти способ 1) изменить размер шрифта (только размер) 2) имеют Scrollview и CustomView размер соответственно.

Как это можно сделать?

EDIT 1: Я создаю пользовательский вид в своем представленииКонтроллер, как это.

CoreDavening *coreDavening = [[CoreDavening alloc]init]; 

    davenView = [[CoreDavening alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, [coreDavening heightForStringDrawing ])]; 

и обновление/обновление пользовательского вида следующим образом.

Он срабатывает, когда установленный слайдер меняет значение.

- (IBAction)sliderChanged:(id)sender { 

    NSUserDefaults *prefs= [NSUserDefaults standardUserDefaults]; 
    [prefs setInteger:(long)self.Slider.value forKey:@"fontSize"]; 
    [prefs synchronize]; 

    [davenView setNeedsLayout]; 
} 

У моего настраиваемого контроллера есть шрифт, подобный.

ЭТО в жеребьевке ФУНКЦИИ

attStorage = [[NSTextStorage alloc]initWithAttributedString:string]; 


    [attStorage addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:(long)[prefs integerForKey:@"fontSize"]] range:NSMakeRange(0, attStorage.length)]; 

    textContainer = [[NSTextContainer alloc] 
             initWithSize:CGSizeMake(self.frame.size.width, FLT_MAX)]; 

    layoutManager = [[NSLayoutManager alloc]init]; 
    [layoutManager addTextContainer:textContainer]; 
    [attStorage addLayoutManager:layoutManager]; 

    NSRange glyphRange = [layoutManager 
          glyphRangeForTextContainer:textContainer]; 
    [layoutManager drawGlyphsForGlyphRange: glyphRange atPoint: rect.origin]; 

ответ

1

Похоже, у вас есть textStorage, связанный с уже в LayoutManager. NSTextStorage - это подкласс NSMutableAttributedString. Таким образом, это класс, который отвечает за сохранение информации о макете и стиле. Как вы создали свой textStorage? Кроме того, стиль, NSTextStorage также имеет методы, позволяющие редактировать содержимое и иметь динамический стиль.

Вы можете просто установить атрибут в свой текстовый блок, если хотите изменить шрифт.

[_textStorage addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20.0] range:NSMakeRange(0, _textStorage.length)]; 

Класс NSTextManager имеет весьма полезные методы для поиска информации о границах и глифах. Таким образом, вы можете использовать метод, как показано ниже, чтобы найти границы для вашего текста,

- (CGRect)boundingRectWithSize:(CGSize)size 
{ 
    self.textContainer.size = size; 

    NSRange glyphRange = [self.layoutManager glyphRangeForTextContainer:self.textContainer]; 

    CGRect boundingRect = [self.layoutManager boundingRectForGlyphRange:glyphRange 
                 inTextContainer:self.textContainer]; 
    boundingRect.origin.x = 0; 
    boundingRect.origin.y = 0; 

    return boundingRect; 
} 
+0

Будет ли это обновлять текст сразу? Или мне нужно вызвать setNeedsLayout или что-то – user2738258

+0

Вам нужно нарисовать его снова, используя setNeedsLayout. – Sandeep

+0

Не обновляется. Ill опубликуйте код для создания представления и обновления – user2738258

Смежные вопросы