よく来たな~、新兵ども!
$テン*シー*シー-bootcamp$テン*シー*シー-bootcamp2
 まずはこいつ↑で、iPhoneやiPadのアプリケーションを作るための知識を一から積み上げる事。どんな機材が必要か、どんな知識が必要か、から初めて、C言語、Objective-C言語まで学習してくれい。でないと、心が通じあえん。Bootcamp2は現在更新中ね。
 Webより本が好き~、な人は、

入門本、ドリル本、デバッグ本、データ本!

もよろしく。

Apple日本語ドキュメントページ恒例のリンク切れ。ここにリンク貼っておく。

「親切すぎるiPhoneアプリ開発の本」のExample、年明け以降に更新しますが、とりあえずここで連絡。
  29/Autolayout-02 ViewController.swiftの62行目
および、
  29/Autolayout-02-alt-00、29/Autolayout-02-alt-01、29/Autolayout-02-alt-02のViewController.swift 71行目は間違いです。

toItem:self.view, attribute:.Left,

toItem:self.view, attribute:.Leading,
に変更してください。

「親切すぎるiPhoneアプリ開発の本」は、ここにも近日公開予定。↓

10xEng480-32


「親切すぎるiPhoneアプリ開発の本」のサンプル、Swift 2.0対応について
 もうちょっと待ってください。
 現在、手元での準備は終わって説明用PDFを公正中。
1 | 2 | 3 | 4 | 5 |最初 次ページ >>
2016年02月12日(金) 00時33分45秒

ゴッドブロー

テーマ:ブログ
ゴッドブローとは女神の怒りと悲しみを乗せた必殺の拳!相手は死ぬ!



AD
いいね!した人  |  コメント(0)  |  リブログ(0)
最近の画像つき記事
 もっと見る >>
2016年01月26日(火) 17時13分13秒

ゴッドレクイエムとは

テーマ:ブログ
女神の愛と悲しみの鎮魂歌
相手は死ぬ !


「この素晴らしい世界に祝福を!」のフォロワー12,000人突破記念、「このすば場面スタンプ」
だそうです。

簡単に作れる!TWITTERスタンプ(仮)の作り方を説明
↑ ビタワンさんのサイトを見て、絵をクリックするとツィートできるようにしてみますた。



AD
いいね!した人  |  コメント(0)  |  リブログ(0)
2016年01月19日(火) 00時39分55秒

iPhoneアプリ開発、その(240) ヒエログリフのグリフ

テーマ:Xcode
 暗号だと思った?
 残念Core Textちゃんでした。
 せっかくCore Text扱ってるので、文字の形状を定義したベジェ曲線を取り出して使ってみマッスル。
 いわゆるグリフ(Glyph:字体)というやつです。
 例えば、世界には同じ「A」を意味する図形がいろいろあるわけですが、この図形それぞれを「A」のグリフというわけですYooo


「A」を意味するいろいろなグリフちゃん
0


 で、OS XやiOSでは、このグリフがベジェ曲線でフォントごとに提供されてまして、Core Textを使うと、指定したフォントから指定した文字のベジェ曲線が取り出せるようになってるんですな。
注意)ベジェ曲線は、数個の座標点を指定して定義する曲線で、iOSやOS Xで曲線を描くのに使う。これ常識な→(iPhoneアプリ開発、その(229) ワン・フロム・ザ・ハート)。
 それが

CTFontCreatePathForGlyph

 で、こいつに取り出したい文字と、どのフォントから取り出したいかを指定することで、指定した文字に対応するグリフが取り出せるようになっている。

 取り出したい文字は番号で指定します。
 この番号はフォントごとに固有であることには注意が必要。
 例えばASCIIコードやunicodeでは、アルファベットの「A」を数値の65と定義してるんですが、これをそのまま番号として渡しても「A」のグリフを指定したことにはなりません。
 グリフを指定するための番号はフォントごとに固有に決められていて、その値を知るためには

CTFontGetGlyphsForCharacters

 を使えってことになってます。
 こいつに、どのフォントかと、どの文字かを指定することで、知りたいグリフ番号を取り出せます。
 ここでようやく文字の指定としてunicodeを使うことになる。
 unicodeは今のところ符号なし16ビット整数で指定します。UInt16型でもいいんだけど、UniCharという型が用意されているんでそっちを使いましょう。NSUIntegerみたいに将来変更されるかもしれんでな。
 unicodeの値も、グリフの番号も同じく符号なし16ビット整数なんだけど、グリフの番号の型はCGGlyph型として用意されているんでこっちを使う。グリフを指定する番号、ちゅ~意味でCGGlyphなんでしょう。
 あと、フォントの指定にUIFontは使えません。
 Core TextはCTFontという専用のオブジェクトが用意されていて、そっちを使います。
 UIFontが示すフォントと同じものを、CTFontととして作りたい場合に使うのは

CTFontCreateWithFontDescriptor

 swiftでは

func CTFontCreateWithFontDescriptor(_ descriptor: CTFontDescriptor, _ size: CGFloat, _ matrix: UnsafePointer) -> CTFont

と定義されていて、第1引数descriptorにはCTFontDescriptorを渡す必要があるけど、こいつにはUIFontから-fontDescriptorメッセージで取り出したUIFontDescriptorをそのまま渡せます。
 sizeには文字のポイント数を指定し、matrixには取り出したグリフの座標系を変更したい時に指定する。そのまま使うならnilを指定。これで新しく作成されたCTFontが戻される。

fontは事前に用意したUIFont
let ctfont = CTFontCreateWithFontDescriptor(font.fontDescriptor(), font.pointSize, nil)

 これでCTFontGetGlyphsForCharactersを使ってグリフ番号を手に入れる準備は完了。例えばアルファベットの「A」のグリフ番号を手に入れたいなら、「A」を意味するunicodeは65なので、上で紹介したCTFontGetGlyphsForCharacters にCTFontと65を渡せば、「A」のグリフを取り出すための番号が手に入る。
 このCTFontGetGlyphsForCharacters、swiftでは

func CTFontGetGlyphsForCharacters(_ font: CTFont, _ characters: UnsafePointer, _ glyphs: UnsafeMutablePointer, _ count: CFIndex) -> Bool

と定義されていて、第1引数fontにCTFontを渡し、次のcharactersにUniChar型の変数の番地か、UniChar型配列の先頭番地を渡すことになってます。
 具体的には配列だと

var unicodes:[UniChar] = [65, 66, 67]
var glyphs:[CGGlyph] = [0, 0, 0]
CTFontGetGlyphsForCharacters(ctfont, &unicodes, &glyphs, unicodes.count)

なんてすることで、「A」、「B」、「C」それぞれのグリフ番号が一気に手に入ることになる。
 成功するとtrue、失敗するとfalseが戻ります。

 ちなみにUniCharの配列であるunicodesは、UnsafePointerとして渡すわけで、これは指し示される内容を変更しないという意味なので、varじゃなくletで用意してもいいんじゃないかと思ったけど実際やると怒られます。
 受け取る方のCGGlyph配列であるglyphsはUnsafeMutablePointerで正真正銘ポイント先の内容が変更されるのでvarにする必要がある。
 上ではCGGlyph配列をリテラル表記で[0,0,0]と3個分羅列して用意してるけど、init(count:, repeatedValue:)を使って用意してもかまいません。ここらへんは好き好きで。初期値なんて設定してもしょうがないけどswiftの決まりなんで0で初期化。あとはcountに確保したい要素数を指定する。今回ならunicodesの要素数分必要なんでunicodes.countを使う。

var glyphs = [CGGlyph](count:unicodes.count, repeatedValue:0)

 それと、ここでは「A」のunicode値として直接65って指定してるけど「A」がunicodeの値でいくつなのかを知る方法もあります。

let unicode = UniChar("A".unicodeScalars.first!.value) unicodeに65が入る

 ま、それは別の機会で触れるとして、CTFontGetGlyphsForCharactersから戻されたCGGlyph配列の番号を使えば、それぞれのベジェ曲線をCTFontCreatePathForGlyphで取り出せます。こいつは

func CTFontCreatePathForGlyph(font: CTFont, _ glyph: CGGlyph, _ matrix:
  UnsafePointer) -> CGPath?

と定義されていて、第1引数fontにはCTFont、次のglyphに番号を渡せばCGPathが戻される。
 matrixはCTFontCreateWithFontDescriptorと同じなのでnilを指定。
 例えば、さっきの「A」、「B」、「C」を取り出したglyphsならglyphs[1]とすることで、「B」のベジェ曲線が戻されるってわけです。

CTFontCreatePathForGlyph(ctfont, glyphs[1], nil)

 戻り値はCGPathに?が付いてる事からわかりますがオプショナルです。パスが作れなかった場合はnilが戻されるので、その点のチェックも忘れないように。
 サンプルでは指定したunicode1文字のパスを取り出すメソッドを用意して使っています。

サンプル:https://github.com/Takahiro-Kunii/TextToPath.gitのBranch:v1


// 指定したfontから、指定したunicodeに対応するCGPathを取り出す
func unicodeToCGPath(var unicode:UniChar, font:UIFont) -> CGPath? {
// 取り出しにはCore TextのAPIを使うのでUIFontではなくCTFontを用意しなければいけない
let ctfont = CTFontCreateWithFontDescriptor(font.fontDescriptor(), font.pointSize, nil)

// CTFontが管理する文字形状(CGPath)群は、そのCTFont独自のインディックスで
// 管理される。このインディックスはCGGlyph型として定義されていて、指定した
// unicode列に対応するCGGlyph列を返すAPI
// CTFontGetGlyphsForCharacters
// を使い取り出せる

var glyph:CGGlyph = 0 // 指定されたunicodeに対応するインディックス
if CTFontGetGlyphsForCharacters(ctfont, &unicode, &glyph, 1) {
// インディックス(CGGlyph)が取り出せたので、これを指定して対応する
// 文字形状(CGPath)を取り出す

return CTFontCreatePathForGlyph(ctfont, glyph, nil)
}

// インディックスが取り出せなかった(指定したフォントに、指定したunicodeの
// 文字形状が用意されていない等)

return nil // 失敗
}

 上のglyphのように、1文字なら、CGGlyph配列使わずにCGGlyph変数を使うこともできる。
 サンプルでは取り出したベジェ曲線を枠線を描いたり、塗りつぶしたりできるCALayer派性クラスのオブジェクト

CAShapeLayer

に設定して画面に表示させてます。
 あとオプショナルが戻されるので、アンラップしてnilでない時だけ実行するようにしてる。

if let path = self.unicodeToCGPath(0x65, font:font) {

 このif let path = てのが、unicodeToCGPathからの戻り値、CGPath?をアンラップしてnilでないか確認する作業。nilでなければpathにCGPathが設定される。

if let path = self.unicodeToCGPath(0x65, font:font) {
let shape = CAShapeLayer()
shape.path = path // ベジェ曲線設定
shape.frame = CGPathGetBoundingBox(path) // 矩形設定(レイヤなので
// 設定しなくても表示されるが…)


// サブレイヤーとして登録
self.view.layer.addSublayer(shape)

// 位置調整 ほぼ真ん中に配置
shape.position = self.view.center
}

 ちなみにiOSと文字のベジェ曲線の座標系が違うんで上下逆転してる。
1
 ま、それは後で対応するとして、グリフ形状のCAShapeLayerが作れたことで何ができるかというと画面のマスキングができるんですな。
 例えばUIImageViewなんかで画像を表示しておいて、このUIImageViewのlayerのmaskプロパティに指定するとこうなる。
2
 でもって、CAShapeLayerはCALayer派性なんでアニメーションもでき。
 前回のその(239)で使った領域指定にも使える、はず。
 というところで、以下次回!
AD
いいね!した人  |  コメント(0)  |  リブログ(0)
1 | 2 | 3 | 4 | 5 |最初 次ページ >>

AD

Ameba人気のブログ

Amebaトピックス

      ランキング

      • 総合
      • 新登場
      • 急上昇
      • トレンド

      ブログをはじめる

      たくさんの芸能人・有名人が
      書いているAmebaブログを
      無料で簡単にはじめることができます。

      公式トップブロガーへ応募

      多くの方にご紹介したいブログを
      執筆する方を「公式トップブロガー」
      として認定しております。

      芸能人・有名人ブログを開設

      Amebaブログでは、芸能人・有名人ブログを
      ご希望される著名人の方/事務所様を
      随時募集しております。