問題タブ [cashapelayer]
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.
ios - フレーム移動による CAShapeLayer のアニメーション化
コア アニメーション レイヤーを使用して、次の機能を実装しようとしています。包含スーパーレイヤー内には、2 つのアンカー レイヤーと、2 つを接続する別のレイヤーがあります。次の画像は、状況を明確にする必要があります。左側では、2 つのオレンジ色のアンカーが「A」と「B」とマークされており、緑色の線がそれらを接続しています。囲んでいるレイヤー フレームは点線で表示されます。右側には、私が現在実装しているレイヤー階層が示されています。アンカーと接続の両方が、外側のスーパーレイヤーのサブレイヤーです。
今、私がやろうとしているのは、アンカーを移動できるようにし、接続を接続したままにすることです。-setFrame:
現在、以下に示すコードを使用して、接続レイヤーのメソッドを利用してフレームとパスのプロパティを更新しています。
- (void)setFrame:(CGRect)frame {
}
さて、この種の動作はしますが、問題は、フレーム (または位置 + 境界) アニメーションがパス アニメーションと同期して実行されず、接続の遠端が瞬間的に切り離されるジッタリング効果が発生することです (およびその他のいくつかの小さな問題が発生します)。 、おそらく同じコアの問題が原因です)。
私はこの問題をいじくり回してきましたが、成功を緩和するためだけです。ある時点で、接続のフレームを囲んでいるスーパーレイヤーのフレームと同じに設定しました。これにより、目的の効果が得られました (フレームをアニメーション化する必要がなくなったため)。ただし、複数の接続があるコンテキストでのこのソリューションのパフォーマンスが心配です。複数の非不透明で大きなサイズの重なり合うレイヤーが悪いように見えますか?
これに対するより優れた、よりエレガントなソリューションを誰かが持っているでしょうか? ありがとう!
ios - CALayerとCGContextのどちらが、より優れた設計アプローチですか?
私はiOSの描画を実験してきました。実践的な演習を行うために、棒グラフコンポーネントを作成しました。以下はクラス図です(まあ、画像のアップロードは許可されていませんでした)ので、言葉で書かせてください。UIViewから継承するNGBarChartViewには、NGBarChartViewDataSourceとNGBarChartViewDelegateの2つのプロトコルがあります。コードはhttps://github.com/mraghuram/NELGPieChart/blob/master/NELGPieChart/NGBarChartView.mにあります
棒グラフを描画するために、各棒グラフを異なるCAShapeLayerとして作成しました。これを行った理由は2つあります。1つはUIBezierPathを作成し、それをCAShapeLayerオブジェクトにアタッチすることです。2つは、[Layer hitTest]メソッドを使用して、barItemがタッチされたかどうかを簡単に追跡できます。コンポーネントはかなりうまく機能します。ただし、棒グラフを描画するために採用したアプローチには満足していません。したがって、このメモ。以下について専門家の意見が必要です
- CAShapeLayerを使用してBarItemsを作成することにより、私は実際にはUIGraphicsContextを使用していませんが、これは優れたデザインですか?
- 私のアプローチでは、UIView内にいくつかのCALayerを作成します。パフォーマンスに基づいて、UIViewで作成できるCALayerの数に制限はありますか?
- CGContext *メソッドを使用するのが適切な代替手段である場合、特定のパスにアクセスしたかどうかを識別する正しい方法は何ですか。
- タップしたときにバーが点滅するなど、アニメーションの観点からは、レイヤーデザインまたはCGContextデザインの方が優れています。
ヘルプは非常に高く評価されています。ところで、あなたは私のコードとコメントを自由に見ることができます。改善のための提案を喜んで受け入れます。
最高、ムラリ
ios - CAShapeLayer パスの色の変更
したがって、質問のタイトルが最も説明的ではない可能性があることを知っているので、ここで実行します。
基本的に私が持っているのは、(レイヤーのコンテンツ プロパティを使用して) 画像を表示したもので、そのレイヤーの下に CAShapeLayer である Drawing レイヤーがあります。両方のレイヤーが存在する私のビューでは、CALayerDelegate もあり、今のところ、タップ ジェスチャに応答して特定の色で CGPaths を使用してポイントを描画します (タップ ジェスチャ セレクターは CAShapeLayer で setNeedsDisplay を呼び出します)。私が抱えている問題は、色を変更すると、ビューをタップすると、以前のすべてのポイントが自動的に新しく選択された色になることです...良くない...元の色を維持するには、各サブパス(つまりポイント)が必要です...多分いくつかのコードは、トピックにもう少し光を当てます:
デリゲート (注: drawingView.drawingPath は再利用されます):
}
そして私のタップジェスチャレコグナイザー:
}
誰かがここで私が間違っていることを教えてくれたら、私は有頂天になるでしょう! :(
ios - How to reverse the point order of a CGPath
I want to draw a Circle with Letter punched out of it. to do this, I need to stroke the circle clockwise and the letter counterclockwise.
That is all good and well, but when I get the letter path using Core Text I can't figure out how to essentially reverse the path. NOT MIRROR or ROTATE or anything...that is straightforward enough. I want the point stroke order to be counterclockwise.
it is actually hilariously difficult. I've had entirely too many visual 'off by one' errors.
iphone - コーナーをタップして CAShapeLayer のポリゴン形状を変更するにはどうすればよいですか?
8 つの角を持つ多角形で CAShapeLayer を描画しています。一度に 1 つまたは複数の角をドラッグして、多角形の形状を変更したいと考えています。どうすればこれを達成できますか?
乾杯AF
iphone - iPhone armv7 で CAShapeLayer リンクエラーの使い方
これはおそらく非常に単純なことですが、以前に CAShapeLayers を使用したことがないため、これを上部にインポートしました。
import < QuartzCore/QuartzCore.h >
コンパイラは文句を言っていませんが、リンカには次のエラーがあります。
これを機能させるには何をインポートする必要がありますか?、私は Xcode 4.2 を使用し、iPhone iOS 4.3 用にビルドしています。
iphone - レイヤーの後ろではなく前に NSString (drawInRect を使用) を描画するにはどうすればよいですか?
私の見解でinitWithFrame
は、ルート レイヤーを作成し、それにサブレイヤーを追加します。サブレイヤーのパスを設定して、色付きのボックスを描画します。ボックスの上にテキストを表示したいので、ビューのdrawRect
で NSString のdrawInRect
メソッドを使用してテキストをレンダリングしますが、常にボックスの後ろに描画されます。
深さを変更して、カラーボックスレイヤーの前にテキストを何らかの方法で描画する方法はありますか?
写真: http://i.imgur.com/zins6.png
サブレイヤーの不透明度が低い: http://i.imgur.com/qyJLU.png
代わりにCATextLayerをサブレイヤーに追加しようとしました-動作しますが、遅くなります(各ビューはUITableViewCellにあり、NSString drawInRectメソッドを使用してスクロールがはるかにスムーズになります)。
サブレイヤーの上に文字列を描画する方法を知っている人はいますか? サブレイヤーの z 位置を低く設定しようとしましたが、効果はありませんでした。drawRect
グラフィックス コンテキストの深さを変更する方法がわかりません。また、可能かどうかもわかりません。
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)
。繰り返しますが、それは機能しますが、非常に複雑です)
ios - CALayersを適切にマスキングする
TapkuLibraryの他の点では優れたTKCalendarDayEventViewを使用しており、 StuDevがここで示すように、ビューのコーナーの1つを選択的に丸めようとしています。残念ながら、StuDevのコードスニペットを適用すると、EventViewが含まれているTKCalendarDayTimelineViewから完全に消えてしまいます。このコードスニペットを現在のコードの下に追加しています
+ (id)eventViewWithFrame:(CGRect)frame id:(NSNumber *)id startDate:(NSDate *)startDate endDate:(NSDate *)endDate title:(NSString *)title location:(NSString *)location;
方法。コードの境界線の幅、色、または半径を設定するコードをコメントアウトしました。アップルのドキュメントではスーパーレイヤーのあるレイヤーにマスクを追加しないように警告されているため、TKCalendarDayEventViewにスーパーレイヤーがないことを確認しました。
マスクを新しいレイヤーに設定するときは、最初に新しいレイヤーのスーパーレイヤーをnilに設定する必要があります。そうしないと、動作が定義されません。
また、maskLayerのbackgroundColorプロパティとfillColorプロパティを試してみました。TKCalendarDayEventViewには、このマスクが正しく適用されないようにする可能性のあるものは何もありません。何が間違っているのでしょうか?
iphone - サブクラス化を使用してCALayerをカスタム化する方法
UIViewには、いくつかのCALayerがあります。各CALayerはCAShapeLayersで構成されています。CAShapeLayersのパスプロパティはUIBezierPathで構成されています。
私の目的は、CALayerをタップしたときに、UIBezierPathの描画で使用したポイントを取得することです。そのために、ポイントを格納するためのNSMutableArrayを持つCALayerをサブクラス化することを考えました。特にCALayerを描画するときにポイントを節約します。したがって、特定のCALayerをタップするたびに、それに関連付けられたポイントを取得します。また、各CALayerにタグを付けたいと思います。私はこれを行う方法がわかりません。
2番目の方法は、CALayerの組み込みプロパティを使用して、CALayerでキャプチャされたポイントを取得することです。しかし、私はこの種の特性を知りません。
このタスクを実行する方法についてあなたのアイデアを共有してください。