問題タブ [cgpath]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - 以前に準備された CGPath を描画すると、CATiledLayer がクラッシュする
UIScrollView 内に配置した UIView のバッキング レイヤーとして CATiledLayer を使用しています。ビューの init メソッドで、単純な線を描画する CGPathRef オブジェクトを作成しています。drawLayer:inContext 内でこのパスを描画しようとすると、スクロール/ズームしているときに、(まれに) EXEC_BAD_ACCESS でクラッシュすることがあります。
コードは非常に単純です。標準の CG* 関数のみを使用しています。
更新: この問題は iOS 5 にのみ存在することに気づきました。4.3 では問題なく動作します。
objective-c - CGPath を使用する利点は何ですか?
私はCGPathの概念に不慣れで、ベジエ曲線についてまともな考えを持っています. ビューを使用して小さなフリーハンド描画プログラムを作成しています。drawRect では、配列から記録された一連の行を描画し続けます。マウスが動いている間に、その配列に新しい行を追加し、ビューを更新します。drawrect が再度呼び出され、記録された一連の行が再度描画されます。
私は CGPath について読んでいました。一連の線とベジエ曲線を保存します。
CGPath を使用すると、パフォーマンスが向上しますか?
objective-c - 文字列としてのCGPath
CGPathの実際のデータを取得して、ファイルに保存して後で復元できるようにする方法はありますか?
そして、そのデータがどのように構造化されているかについてのドキュメントはありますか?
文字列(SVGパス文字列など)として、または辞書オブジェクトとPList XMLファイルを使用して何らかの方法で記述したいのですが、取得できるものを使用します。
objective-c - 画面が更新されたときにどの行を再描画するかを決定するために、どのアルゴリズムを使用する必要がありますか?
画面上で描画および消去できるシンプルな iOS View ベースのアプリケーションを作成しました。既に描画されたパスを格納するために NSMutableArray を使用しています。コントロールをマーカーから消しゴムに、またはその逆に切り替えるたびに、現在の CGPath を配列に追加して新しいものを作成します。
drawRect のたびに、消しゴムのパスかマーカーのパスかに応じて、適切な色で配列のパスを再描画します
タッチの移動に合わせて描画されている現在のものも描画します。
これはまったく良い解決策ではなく、配列のサイズが大きくなるにつれて大量の RAM を消費することがわかりました。私の配列には、すでに同じ色で色付けされたポイントを実際に通過する冗長パスが既に含まれており、それを再度実行するためにプロセッサの時間を不必要に消費し、メモリも消費します。
リソースを節約するためのより良いアルゴリズムを参照できる人はいますか?
calayer - 新しく作成された CAShapeLayer の正しいフレームの設定
要するに:
frame
Apple は、またはbounds
を自動的に設定しませんCAShapeLayer
(また、Apple は に相当するものを実装していません[UIView sizeThatFits]
) 。- パスの境界ボックスのサイズを使用してフレームを設定すると、すべてがうまくいきません。どんなに設定しようとしても、パスを台無しにします
CAShapeLayer
では、新しく追加された で新しく作成された のフレームをプログラムで設定する正しい方法は何CGPath
ですか? Apple のドキュメントはこの件について沈黙を守っています。
私が試したこと、うまくいかないこと:
- 作成する
CAShapeLayer
- を作成
CGPath
し、レイヤーに追加します - レイヤーを確認してください
frame
- それは{{0,0},{0,0}}
- 設定:
layer.frame = CGPathGetBoundingBox( layer.path )
フレームは正しくなりましたが、パスは DOUBLE オフセットになりました - を変更する
frame
と、パスが実質的に余分な(x,y)
ピクセル分シフトされます設定:
layer.bounds = CGPathGetBoundingBox( layer.path )
- ...すべてが狂ってしまいます。もう何も意味がない
- 実行して修正してみてください
layer.position = CGPathGetBoundingBox( layer.path ).origin
- ...サイコロはありません。まだナッツ。
私が試したことの1つは、DIDが機能することですが、他の場所で問題を引き起こします:
編集:画面を自動回転するとすぐに壊れます。私の推測: Apple の自動回転には、「変換」プロパティの制御が必要です。
- 作成する
CAShapeLayer
- を作成
CGPath
し、レイヤーに追加します - レイヤーのフレームを確認してください - それは
{{0,0},{0,0}}
- 設定:
layer.frame = CGPathGetBoundingBox( layer.path )
- 設定:
layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin
CALayer
これは機能しますが、多くのサードパーティ コードでは、a の初期変換が Identityであると想定されています。
こんなに難しくないはず!確かに私はここで間違っていることがありますか?
(「パスを追加するたびに、手動でカスタム関数を実行してすべてのポイントをシフトする」という提案がありました-1 * (top-left-point.x, top-left-point.y)
。繰り返しますが、それは機能しますが、非常に複雑です)
iphone - 曲線を変更/修正するためにどのアルゴリズムを使用する必要がありますか
UIBezierPathを使用して、多数の曲線を描画するアプリケーションを作成しました。今、私はそれに変更機能を実装しようとしています。特定の曲線を変更するために私ができることの1つは、すべての曲線を再度描画することです。私はまだこれを実装していません。しかし、曲線の数が増えると、このアルゴリズムはあまり効率的ではないと思います。配列内のすべてのポイントを格納する必要があり、変更するたびにforループを実行して各曲線を描画する必要があるためです。
より効率的なアルゴリズムを探しています。誰かがサンプルコードを提供できれば役に立ちます。
iphone - 不規則な形状の UIBezierPath の塗りつぶし
私はいくつかのカスタムコントロールを作成しています。コントロールのサブビューの 1 つは透明UIView
で、UIBezierPath
パスが描画されています。写真の 1 つは境界線としましょうUIBezierPath
([パス ストローク] と呼ばれます) ですが、2 番目の写真では [パス フィル] を呼び出すとどうなるかがわかります。最初の写真のような形になるようにパスを塗りつぶしたいと思います。drawRect
このトランスペアレントからのメソッドUIView
は以下のとおりです。
手伝ってくれてありがとう !
objective-c - CGPathを頻繁に描画するときのパフォーマンス
データを線グラフとして視覚化するiOSアプリに取り組んでいます。グラフはCGPath
フルスクリーンカスタムで描画されUIView
、最大320のデータポイントが含まれます。データは頻繁に更新されるため、それに応じてグラフを再描画する必要があります。リフレッシュレートは10/秒が適切です。
これまでのところ簡単です。ただし、私のアプローチには多くのCPU時間がかかるようです。1秒間に10回で320セグメントでグラフを更新すると、iPhone 4SでのプロセスのCPU負荷が45%になります。
たぶん私は内部のグラフィックス作業を過小評価していますが、私にはそのタスクにはCPU負荷が大きいように見えます。
以下は、drawRect()
新しいデータセットの準備ができるたびに呼び出される私の関数です。N
ポイントの数を保持し、描画する座標をpoints
持つベクトルです。CGPoint*
ここで提案されているように、現在のレイヤーにパスを追加する前に、まずオフラインCGContextへのパスをレンダリングしようとしましたが、肯定的な結果は得られませんでした。また、CALayerに直接描画するアプローチをいじりましたが、それでも違いはありませんでした。
このタスクのパフォーマンスを改善する方法について何か提案はありますか?それとも、レンダリングは、私が認識しているCPUの作業が単純に多いのでしょうか。OpenGLは意味がありますか/違いはありますか?
ありがとう/Andi
更新:私もUIBezierPath
の代わりに使用してみましCGPath
た。この投稿は、なぜそれが役に立たなかったのかについての良い説明を提供します。微調整CGContextSetMiterLimit
等。また、大きな安堵をもたらさなかった。
アップデート#2:私は最終的にOpenGLに切り替えました。それは急でイライラする学習曲線でしたが、パフォーマンスの向上は驚くべきものです。ただし、CoreGraphicsのアンチエイリアシングアルゴリズムは、OpenGLの4xマルチサンプリングで実現できるものよりも優れた機能を果たします。
objective-c - CGPath をファイルに保存する方法
以下のような CALayers 内に約 20 個の単純な形状を描画しています (CAShapelayer で描画された CGPaths)。現在、この形式の 20 個の図形すべてを含む非常に長いファイルがあります。親UIViewが作成されると、前の画面で選択されたものに基づいて、これらの形状の1つが読み込まれます.これはうまく機能していますが、形状コードを維持するのは面倒です. 以下のコードのブロックを取得し、必要に応じて呼び出して実行できる個別のファイルに保存する最良の方法は何ですか?(例: star.txt、apple.txt、moon.txt、tree.txt):
ios - カラー バーンを CGPath の内側に制限する
CGPath (実際には、CGMutablePath) として定義された閉じたパスがあります。
パスで定義された UIImage の特定の領域をカラー焼き付けしたい。私は Core Graphics をいじっていますが、現在のところ、私の唯一のオプションは、パスではなく、CGRect によって定義された長方形の領域に色を付けることです。
誰かが私を正しい方向に向けることができますか?
- アップデート
Rob の助けを借りて、カメラから取得した画像を 90 度回転させて、UIImageview に正しく表示されるようにしました。
私が残した唯一の問題は、描画する必要がある PATH がまだ 90 度であり、縮尺が合っていないことです。私が現在使用しているコードは次のとおりです。
その結果が次の画像です。赤い四角形は CGPATH を表しています。白い四角は、実際にはパス上の上記の方法の結果です。
http://i41.tinypic.com/f1zbdi.png
COS 数学を使用して CGPATH を手動で 90 度回転させる必要があると思います。