Calayerのベジエパスを入手してください -- ios フィールド と objective-c フィールド と calayer フィールド と uibezierpath フィールド 関連 問題

Obtain Bezier Path of CALayer












0
vote

問題

日本語

CALayer オブジェクトには、述べられているとおり

が存在している accessibilityPath があります。

画面座標内の要素のパスを返します。

もちろん予想通りこのがレイヤーのパスを返しません。

は、既に作成されている特定の CALayer の物理パスにアクセスする方法はありますか?たとえば、ボタンが初期化された後に、<コード> 9988777663 のレイヤープロパティのパスをどのように把握しますか。

編集

参照のために、回転したボタンが点を含むかどうかを検出しようとしています。ここでの難しさの理由は、ボタンが湾曲したビューに描かれているという事実によることです...

私の最初のアプローチは、ベジエスライスを作成することで、パスにポイントが含まれているかどうかを確認するためにボタンのプロパティとしてそれらを渡します。何らかの理由で、パスとボタンから醜いオフセットがあるようです。

それらは同じビューに追加され、同じ座標/値を使用してフレームを決定しますが、登録されたパスはパスから実際の描画形状から左にずれているようです。下記は私が描かれた形状のイメージです。緑色のアウトラインは、パスが描かれている場所(表示されています)は、赤がほぼの内側に登録されている領域です...

画像の説明を入力しますここで

登録領域がどのように異なるかを理解するのに苦労しています。

誰かがのアイデアを持っていたら、なぜこのオフセットが発生するでしょう。

更新

これは私の形状を追加する範囲です。 <コード> self この場合は、コントローラに追加された UIView です。フレームは、コントローラのフルサイズです。 `{0、height_of_device - controllerheight、width_of_device、conterleallheight}

<事前> <コード> UIBezierPath *slicePath = UIBezierPath.new; [slicePath moveToPoint:self.archedCenterRef]; [slicePath addArcWithCenter:self.archedCenterRef radius:outerShapeDiameter/2 startAngle:shapeStartAngle endAngle:shapeEndAngle clockwise:clockwise]; [slicePath addArcWithCenter:self.archedCenterRef radius:(outerShapeDiameter/2 - self.rowHeight) startAngle:shapeEndAngle endAngle:shapeStartAngle clockwise:!clockwise]; [slicePath closePath]; CAShapeLayer *sliceShape = CAShapeLayer.new; sliceShape.path = slicePath.CGPath; sliceShape.fillColor = [UIColor colorWithWhite:0 alpha:.4].CGColor; [self.layer addSublayer:sliceShape]; ... ... button.hitTestPath = slicePath;

私のボタンサブクラスの別の方法でポイントを含むかどうかを検出するには:( 9988777667 はコースのボタンです)

<事前> <コード> ... if ([self.hitTestPath containsPoint:touchPosition]) { if (key.alpha > 0 && !key.isHidden) return YES; else return NO; } else return NO;
英語

CALayer objects have a property accessibilityPath which as stated is supposedly

Returns the path of the element in screen coordinates.

Of course as expected this does not return the path of the layer.

Is there a way to access the physical path of a given CALayer that has already been created? For instance, how would you grab the path of a UIButton's layer property once the button has been initialized?

EDIT

For reference, I am trying to detect whether a rotated button contains a point. The reason for the difficulty here is due to the fact that the buttons are drawn in a curved view...

My initial approach was to create bezier slices then pass them as a property to the button to check if the path contains the point. For whatever reason, there seems to be an ugly offset from the path and the button.

They are both added to the same view and use the same coordinates / values to determine their frame, but the registered path seems to be offset to the left from the actual drawn shape from the path. Below is an image of the shapes I have drawn. The green outline is where the path is drawn (and displayed....) where the red is approximately the area which registers as inside the path...

enter image description here

I'm having a hard time understanding how the registered area is different.

If anyone has any ideas on why this offset would be occurring would be most appreciated.

UPDATE

Here is a snippet of me adding the shapes. self in this case is simply a UIView added to a controller. it's frame is the full size of the controller which is `{0, height_of_device - controllerHeight, width_of_device, controllerHeight}

UIBezierPath *slicePath = UIBezierPath.new;  [slicePath moveToPoint:self.archedCenterRef]; [slicePath addArcWithCenter:self.archedCenterRef radius:outerShapeDiameter/2 startAngle:shapeStartAngle endAngle:shapeEndAngle clockwise:clockwise]; [slicePath addArcWithCenter:self.archedCenterRef radius:(outerShapeDiameter/2 - self.rowHeight) startAngle:shapeEndAngle endAngle:shapeStartAngle clockwise:!clockwise]; [slicePath closePath];  CAShapeLayer *sliceShape = CAShapeLayer.new; sliceShape.path = slicePath.CGPath; sliceShape.fillColor = [UIColor colorWithWhite:0 alpha:.4].CGColor; [self.layer addSublayer:sliceShape];  ... ...  button.hitTestPath = slicePath; 

In a separate method in my button subclass to detect if it contains the point or not: (self here is the button of course)

... if ([self.hitTestPath containsPoint:touchPosition]) {     if (key.alpha > 0 && !key.isHidden) return YES;     else return NO; } else return NO; 
</div
           
   
   

回答リスト

2
 
vote

あなたは財産を完全にミサポートしました、これはdocsからの支援技術のためのものです:

抜粋:

"このプロパティのデフォルト値はnilです。パスが設定されていない場合は、アクセシビリティフレーム矩形を使用して要素を強調表示します。

このプロパティの値を指定すると、補助テクノロジは、指定したパスオブジェクトを(アクセシビリティフレームに加えて、その代わりに)要素を強調表示します。 "< / P>

あなたはシャサペレヤーからの道を得ることしかできません、他のすべての焼夷者はすべての道で描かれている必要はありません。

アップデートにアップデートする:

オフセットは欠落

によるものだと思います

uiview <コード> convert(_ point: CGPoint, to view: UIView?)

ポイントをボタン座標系に変換する必要があります。

 

You completely missunderstood the property, this is for assistive technology, from the docs:

Excerpt:

"The default value of this property is nil. If no path is set, the accessibility frame rectangle is used to highlight the element.

When you specify a value for this property, the assistive technology uses the path object you specify (in addition to the accessibility frame, and not in place of it) to highlight the element."

You can only get the path from a CAShapeLayer, alls other CALayers don't need to be drawn with a path at all.

Update to your update:

I think the offset is due to a missing

UIView convert(_ point: CGPoint, to view: UIView?)

The point needs to be converted to the buttons coordinate systems.

</div
 
 
       
       

関連する質問

0  端にクリップを迅速にする三角形のビューを作成する  ( Create a triangle view in swift that clips to the edges ) 
私は2つの別々の三角形のビューを作成しようとしています。左側の三角形は白で右側が黒です。 ユーザー対話型である両方の三角ビューが必要ですが、UibezierPathとSashapeLayerを使用して三角形を作成しているため、ビュー全体の全ての三角形を覆ってい...

0  AxesDrawerはSwift3 Xcode 8を描画できません  ( Axesdrawer cannot draw swift3 xcode 8 ) 
グラフ化電卓アプリを作成しようとしていて、AxesDrawerが機能することはできません。これはSwift 2を使ったスタンフォード大学コースからのもので、UibezierPathなどを使ってこのアウトを描く方法がわからない 軸線引き除去: <事前> <コード...

0  Suacepellayer衝突検出  ( Cashapelayer collision detection ) 
誰かが2つの異なる CAShapeLayer の衝突/交差点の検出を手助けすることができます。私が知っているようにそれができるが不可能ではないことが難しいので。同じことを達成するためのアイデア/ロジックとなるでしょう。 $hostVirtualInterf...

1  Cabasicanimation Calayer Path Animation Direction  ( Cabasicanimation calayer path animation direction ) 
env0 key pathを使用して、レイヤパスプロパティをアニメートしようとしています。正確な結果を得ていない 私が探しているパスアニメーションのどのような変更はです 予想されるアニメーション href="https://i.stack.imgu...

3  グラデーションカラーや影を使用せずに、UibezierPathによってトリミングされるUIImageに本当の羽毛/フェード効果を達成する方法  ( How to achieve real feather fade effect on a uiimage which is cropped by a uibez ) 
UIBezierPath は、 UIImage の一部を一部し、その後BezierPathからObjective-Cで内側に向かって羽毛/フェード効果を適用したいが、望ましくない勾配の色や影、またはそのような任意のトリックを使用する。実際のイメージのアルフ...

6  螺旋を描くためにベジエ曲線を使用してください  ( Using a bezier curve to draw a spiral ) 
これはiPadアプリケーションのためのものですが、本質的に数学の質問です。 様々な(単調増加する)線幅の円弧を描く必要があります。曲線の始めには、それは開始厚さを有する(2pTSを言う)、そしてその厚さは、それがその最大の厚さになるであろうアークの終わりまでス...

2  UIViewの特定の角度で開いた端の三角形を描く方法は?  ( How to draw an open ended triangle with a specific angle in an uiview ) 
ここで軽く逆らって、これでいくらかの援助が必要です。テスト目的のために、私は私が拒否されたuiview(下記のコード)を持っています。私は特定の角度で円を描くことができますが、それは充填され閉じています。私は開いて絞ったことが必要です。私は現在Uibezier...

0  Uibezierアニメーションを再生して一時停止する方法を迅速に  ( Swift how to play and pause a uibezier animation ) 
私は循環Uibezierアニメーションを使ってカウントダウンタイマーを表示するプロジェクトに取り組んでいます。私は時間の追跡を開始して停止する再生と一時停止ボタンを持っていますが、アニメーションは続行し続けます。 アニメーションを一時停止して再開する方法これは...

3  描画時のUibezierPath StrokeColorアウトライン  ( Uibezierpath strokecolor outline when drawing ) 
アプリのフリーハンド図でテストをしています。私は線描画と消去方法を実行しました。 <事前> <コード> - (void)drawRect:(CGRect)rect { [self.addingImage drawInRect:rect]; [s...

12  UIView(iOS)でハートの形を描く方法は?  ( How to draw heart shape in uiview ios ) 
さまざまな形を作成したいです。以下の画像は例の1つです。あなたは私にさまざまな形になる方法を提案しますか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有