zoukankan      html  css  js  c++  java
  • 日语竖向

    https://github.com/object-kazu/CoreText-Tate

    //
    //  EDTextView.h
    //  coretext
    //
    //  Created by kunii on 2013/11/30.
    //  Copyright (c) 2013年 國居貴浩. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface EDTextView : UIView
    
    @end
    
    
    //
    //  EDTextView.m
    //  coretext
    //
    //  Created by kunii on 2013/11/30.
    //  Copyright (c) 2013年 國居貴浩. All rights reserved.
    //
    
    //  Core Text Programming Guide
    //  https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html
    #import <CoreText/CoreText.h>
    #import "EDTextView.h"
    
    @implementation EDTextView
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            self.backgroundColor = [UIColor clearColor];
        }
        return self;
    }
    
    - (void)drawRect:(CGRect)rect
    {
        //  表示する文字列
        NSString* string = @"你好。";
    
        //  CoreTextを使ったテキスト描画
    
        //  縦書き対応の16ポイントフォント使用Helvetica
        CTFontRef font = CTFontCreateWithName(CFSTR("HiraKakuProN-W3"), 16, NULL);
        
        //  文字に黄色指定
        UIColor* textColor = [UIColor blackColor];
    
        //  段落設定
        NSMutableParagraphStyle* paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = NSTextAlignmentCenter;   //  センタリング
        paragraphStyle.minimumLineHeight = 20;              //  行間20ポイント
        
        //  NSAttributedString用の属性を用意
        NSDictionary *attributes = @{
                                     NSFontAttributeName:(__bridge_transfer id)font,
                                     NSForegroundColorAttributeName:textColor,
                                     NSParagraphStyleAttributeName:paragraphStyle,
                                     (__bridge id)kCTVerticalFormsAttributeName:@YES
                                     };
    
        //  属性指定でNSAttributedString作成
        NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string
                                                                               attributes:attributes];
    
        //  CTFramesetter用意
        CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attributedString));
        
        //  CTFramesetterを使い、文字列を指定した領域(今回はビューの矩形)に配置させたCTFrameを作成する
        
        //  ハートの形のベジェ曲線でCTFrameの枠を指定する
        UIBezierPath* path = [UIBezierPath bezierPathWithRect:self.bounds];
        
    //    UIBezierPath* path = self.heart;
    //    [path applyTransform:CGAffineTransformMakeScale(self.bounds.size.width, self.bounds.size.height) ];
    //    [[UIColor blueColor] setFill];
    //    [path fill];
    //    [path applyTransform:CGAffineTransformMakeTranslation(0, -self.bounds.size.height)];
    //    [path applyTransform:CGAffineTransformMakeScale(1, -1)];
        //  CTFrameを縦書きに指定する
        NSDictionary* frameAttributes = @{
                                          @"CTFrameProgression": @(kCTFrameProgressionRightToLeft)
                                          };
        CTFrameRef frame = CTFramesetterCreateFrame(framesetter,
                                                    CFRangeMake(0, 0), path.CGPath, (__bridge CFDictionaryRef)frameAttributes);
        
        //  描画用コンテキスト取り出し
        CGContextRef context = UIGraphicsGetCurrentContext();
        //  座標系の調整 数学で使う上方向にyが増加する座標系にする
        CGContextTranslateCTM(context, 0, self.bounds.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        //  テキスト用のアフィン変換用行列を初期化する
        CGContextSetTextMatrix(context, CGAffineTransformIdentity);
        //  描画
        CTFrameDraw(frame, context);
        
        //  作成したCTFramesetterとCTFrameの所有権を放棄する
        CFRelease(frame);
        CFRelease(framesetter);
    }
    
    //  ハートの形のベジェ曲線作成
    - (UIBezierPath*)heart
    {
        UIBezierPath * path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(0, 0.25)];
        
        [path addCurveToPoint:CGPointMake(0.5, 0.3)
                controlPoint1:CGPointMake(0.1, 0)
                controlPoint2:CGPointMake(0.5, 0)];
        
        [path addCurveToPoint:CGPointMake(0.0, 0.9)
                controlPoint1:CGPointMake(0.5, 0.75)
                controlPoint2:CGPointMake(0.0, 0.9)];
        
        [path addCurveToPoint:CGPointMake(-0.5, 0.3)
                controlPoint1:CGPointMake(0, 0.9)
                controlPoint2:CGPointMake(-0.5, 0.75)];
        
        [path addCurveToPoint:CGPointMake(0, 0.25)
                controlPoint1:CGPointMake(-0.5, 0)
                controlPoint2:CGPointMake(-0.1, 0)];
        
        [path closePath];
        [path applyTransform:CGAffineTransformMakeTranslation(0.5, 0)];
        return path;
    }
    
    @end
    
  • 相关阅读:
    Linux 管道命令(pipe)
    SQLITE入门逐步讲解SQLITE命令行(二)
    用flash上传多个图片、文件的插件TinyBrowser
    PHP的时区问题GMT8
    解决Apache+PHP服务器提示HTTP 500问题
    SQLITE入门逐步讲解SQLITE命令行(四)
    SQLITE入门逐步讲解SQLITE命令行(五)
    linux tar命令使用范例
    SQLITE入门逐步讲解SQLITE命令行(六)
    Tinymce配置智能的Url
  • 原文地址:https://www.cnblogs.com/lihaibo-Leao/p/9970165.html
Copyright © 2011-2022 走看看