iOS 圖文混排


  1) 在iOS 7之前也有一種用於文字排版和渲染的技術——Core Text,而引入Text Kit的目的並非要取代Core Text。 Core Text是面􏰱􏲉層的文字排版和渲染技術,如果我們需要將文本內容􏲊接渲染到圖形上下文時,從性能角度考慮 􏲋,最佳􏲌方案􏰣是使用Core Text。􏲍是從易􏲎用性角度考慮􏲋,使用Text Kit是最好的選擇,因為􏰸能直􏰝􏲊接使用UIKit 提供的一些文本控件,例如:UITextView、UILabel和UITextField,對文字進行排版。

   Text Kit具有很多優點:文本控件UITextView、UITextField和UILabel是構建於Text Kit之上的。Text Kit完全􏲏 掌控着文字的排版和渲染:可以調整字距􏲐、行􏲐距、文字大小􏰔,指定􏱒定的字體,對文字進行分頁或分欄,􏲑支持􏲒文 本編輯􏲓、自定義􏰙文字截􏲔斷,􏲑支持文字的換行、􏲕折疊􏱑和着色􏲖等處理,􏲑支持凸􏱉版印刷效􏱊􏱋􏰖果。

 

􏲗     2)  我們在使用Text Kit時,會􏲧涉及如下核心類。

  • 􏲨  NSTextContainer。定義了文本可以排版的區域􏰮。􏲩默認情況下是􏰭矩形區域􏰮,如果是其他􏱭形􏲪狀的區域􏰮,需要通過子類化NSTextContainer來創建。

  • 􏲨  NSLayoutManager。該類􏲫責對文字進行編輯排版處理,將存儲在NSTextStorage中的數據轉換為可以在視圖控件中顯示的文本內容,並把字字符編碼映射􏲬􏲭到對應的字形上,然后將字形排版到NSTextContainer定􏰙的區􏰮域中。

  • 􏲨  NSTextStorage。主要用來存儲文本的字􏰹和相關屬性,是NSMutableAttributedString的子類。此外,􏰓NSTextStorage中的字􏰹符或屬性發生改變時,會通知NSLayoutManager,進而􏲮做到文本內容的顯示更新。

  • 􏲨  NSAttributedString。􏲑支持渲染不同風格的文本。

  • 􏲨  NSMutableAttributedString。可變類型􏱢的NSAttributedString,是NSAttributedString的子類

                                    

   3)讀者喜歡􏲾􏲿􏳀閱讀圖文並茂􏳁的文章,因此在應用界面中,有時不􏳂僅僅􏳂需要有文字,還要有圖片,這就涉􏰣􏲧及文字和圖 片的混排了。在圖文混排過程中必然會涉􏲧及文字􏰌􏰍圖片的情況,很多文字處理􏳃件(如Word、WPS、Open Office 等)􏱏有這種功能。Text Kit通過􏰌􏰍􏰎􏰏(exclusion paths)將文字按照指定的􏰎路徑􏰏􏰌􏰍在圖片等視圖對象的周圍。

                 

 

  圖文混排的介紹基本就是這樣了,下面就直接上方式方法吧!

      *.h文件

@property (nonatomic,strong) NSTextContainer *textContainer;
@property (strong, nonatomic) IBOutlet UITextView *textView;

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
/**
 *查找關鍵字修改顏色和樣式
 * @param word 關鍵字
 * @param textStorage NSTextStorage對象
 */
-(void)markWord:(NSString *)word inTextStorage:(NSTextStorage *)textStorage;

  

    *.m文件

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
 
    //創建一個矩形區域
    CGRect textViewRect=CGRectInset(self.view.bounds, 10.0, 20.0);
    //創建NSTextStorage對象,它需要一個字符串作為構造方法的參數,這里我們是從TextView 控件取出來付值給它的
    NSTextStorage *textStorage=[[NSTextStorage alloc] initWithString:self.textView.text];
    NSLayoutManager *layoutManager=[[NSLayoutManager alloc] init];
    //將剛創建的nstextStorage和NSLayoutManager對象關聯起來
    [textStorage addLayoutManager:layoutManager];
    self.textContainer =[[NSTextContainer alloc] initWithSize:textViewRect.size];
    //將NSLayoutManager和NSTextContainer關聯起來
    [layoutManager addTextContainer:self.textContainer];
    
    /**
     *重新構建原來的TextView控件,並且重新添加到視圖上。這主要是因為只有重新創建代碼
    *才能通過Text Kit中NSLayoutManager來管理,而原來在Interface Builder中創建的TextView控件不*能使用了
     */
    [self.textView removeFromSuperview];
    self.textView=[[UITextView alloc] initWithFrame:textViewRect textContainer:_textContainer];
//    [self.view addSubview:self.textView];
    [self.textView setFont:[UIFont systemFontOfSize:20.0f]];
    //添加的textView在ImageView之下
    [self.view insertSubview:self.textView belowSubview:self.imageView];
    //設置凸版印刷效果
    [textStorage beginEditing];
    /**
     *聲明一個字典對象,其中包括@{NSTextEffectAttribute-*Name:NSTextEffectLetterpressStyle},NSTextEffectAttributeName是文本效果建,而*NSTextEffect- LetterpressStyle是文本效果值,這里面它們都是常量
     */
    NSDictionary *attrsDic = @{NSTextEffectAttributeName: NSTextEffectLetterpressStyle};
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:_textView.text attributes:attrsDic];
    [textStorage setAttributedString:attrStr];
    [self markWord:@"我" inTextStorage:textStorage];
    [self markWord:@"N" inTextStorage:textStorage];
    [textStorage endEditing];
    
    self.textView.textContainer.exclusionPaths=@[[self translatedBezierPath]];//設置translatedBezierPath方法 
    
}
 
//改變textview和imageView的坐標
- (UIBezierPath *)translatedBezierPath
{
    CGRect imageRect = [self.textView convertRect:_imageView.frame fromView:self.view];  UIBezierPath *newPath = [UIBezierPath bezierPathWithRect:imageRect];
    return newPath;
}
//根據指定的文本設置樣式風格
-(void)markWord:(NSString *)word inTextStorage:(NSTextStorage *)textStorage{
    //
    NSRegularExpression *regex=[NSRegularExpression regularExpressionWithPattern:word options:0 error:nil];
    //通過正則表達式NSRegularExpression對象對TextView中的文本內 容進行掃描,結果放到數組中
    NSArray *matches=[regex matchesInString:self.textView.text  options:0 range:NSMakeRange(0, [self.textView.text length])];
    //為找到的文本設置顏色
    for (NSTextCheckingResult *match in matches) {
        NSRange matchRange=[match range];
        [textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:matchRange];
    }
}

 

  那么圖文混排的效果由上面的代碼就能完成 。

     4)以前的iOS用戶會抱怨􏳽􏳾,為什么不能設置自定義􏰙字體􏱦􏱧呢?在iOS 7系統􏰘之后蘋果對於字體在顯示上做􏲮了一些優 化,􏳿讓不同大小􏰔的字體在屏幕上都􏱏能清晰􏴀􏴁地顯示。通常用戶設置了自己偏􏴂好的字體了,用戶可以􏴃􏴄(設置􏴅-》通用-》輔􏴅􏴆助功能)設置􏴇粗體文字的過程。用戶還可以在下圖所示的􏴃􏴄(設置􏴅-》通用􏴅-》文字大小􏰔) 是設置文字大小􏰔的過程。 

      

􏲍  但是並不是在設置中進行設置就萬􏰣􏴋事大吉􏴌了,我們還要在應用代碼中進行編程,以應對這些變化。我們需要 在應用中給文本控件設置為用戶設置的字體,而不是在代碼中􏴍編碼字體及大小􏰔。iOS 7中可以通過UIFont中新􏴎增的preferredFontForTextStyle:方法來􏳴取用戶設置的字體。

  iOS 7中提供了6種字體樣式供選擇。
􏲨   UIFontTextStyleHeadline。標題字體,例如:報紙􏴏的標題。
􏲨   UIFontTextStyleSubheadline。子標題字體。
􏲨   UIFontTextStyleBody。正文字體。
􏲨   UIFontTextStyleFootnote。􏴐腳注字體。
􏲨   UIFontTextStyleCaption1。標題字體,一般􏴑用於照片或者字幕。 􏲨

   UIFontTextStyleCaption2。另一個可選Caption字體 

        

//監聽系統設置
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(preferredContentSizeChanged:) name:UIContentSizeCategoryDidChangeNotification object:nil];

 

//設置字體大小
-(void)preferredContentSizeChanged:(NSNotification *)notification{
    self.textView.font=[UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}

   經過這兩步就能設置動態字體了!!!!!

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM