2015-10-14 13 views
7

iOS 9では、AppleはcollisionBoundsTypeからUIKit-Dynamicsを導入しました。iOS 9のUIViewの衝突境界線の設定

UIDynamicItemCollisionBoundsTypeRectangleに設定しても、これをUIDynamicItemCollisionBoundsTypeEllipseに設定しても問題はありません。

以下のスクリーンショットは、私が選手のcollisionBoundsTypeが矩形に設定され、ボールが楕円に設定されて作っていますゲームからです:

enter image description here

しかし、私はプレイヤーのcollisionBoundsTypeに設定する場合ここに見られるように、パス、私は奇妙な動作を取得:

enter image description here

ビューは、それが必要以上に高く表示され、衝突体が右にありますどこにあるべきか

- (UIBezierPath *)collisionBoundingPath 
{ 
    maskPath = [[UIBezierPath alloc] init]; 
    [maskPath addArcWithCenter:CGPointMake(SLIME_SIZE, SLIME_SIZE) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO]; 
    return maskPath; 
} 

はまた、私のdrawRect関数は次のようになります:

- (void) drawRect:(CGRect)rect 
{ 
    if (!_color){ 
    [self returnDefualtColor]; 
    } 
    if (!maskPath) maskPath = [[UIBezierPath alloc] init]; 
    [maskPath addArcWithCenter:CGPointMake(SLIME_SIZE, SLIME_SIZE) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO]; 
    [_color setFill]; 
    [maskPath fill]; 
} 

ですが、なぜでしょう

は現在、私はこれに collisionBoundingPathセットを持っていますか?コリジョンボディのパスをビューの図面と同じにするにはどうすればよいですか?

さらに、赤色はビューの背景にすぎません(つまり、view.backgroundColor = [UIColor redColor];)。

+0

図面のエキスパートではありませんが、ドキュメントにはパスがポリゴンである必要があることが示されています。あなたのコードは、弧を追加していますが、パスを閉じていません。おそらく '[maskPath closePath]'を呼んで、違いを生むかもしれない閉じたパスを作成する必要がありますか? –

+0

これは自動的に閉じます – WMios

+0

'drawRect'の塗りつぶしのためにこれが適用されます。あなたの 'collisionBoundingPath'は本当ですか?ドキュメントでは、パスを閉じる場所はどこですか? –

答えて

2

、パスの座標系に関する次の文は、間違っているものを表しているようだ:

作成したパスオブジェクトは、 カウンターで凸多角形を表している必要があります時計回りまたは時計回りの巻線で、パスは と交差してはいけません。パスの(0、0)点は、対応する動的項目の中心点の に配置する必要があります。中心点 がパスの起点と一致しない場合、衝突の動作は と期待どおりに機能しない可能性があります。

ここでは、パスの(0,0)が中心点である必要があります。

円弧の中心が(0,0)で、(SLIME_SIZE/2,SLIME_SIZE/2)ではないと思います。 UIViewフレームの幅と高さをSLIME_SIZE*2ではなくSLIME_SIZEに設定していますか?

SLIME_SIZEは実際に半径を定義するように見えるので、フレーム幅はSLIME_SIZE*2である必要があります。 SLIME_SIZEと設定されている場合は、理由として、SLIME_SIZE/2を訂正する必要がある理由が説明されます。

+0

偉大な答えは、これは本当に私の修正が働いた理由の理由を説明した。 – WMios

1

私は変更することによって、これを答えることができた:

- (UIBezierPath *)collisionBoundingPath 
{ 
    maskPath = [[UIBezierPath alloc] init]; 
    [maskPath addArcWithCenter:CGPointMake(SLIME_SIZE, SLIME_SIZE) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO]; 
    return maskPath; 
} 

に:

- (UIBezierPath *)collisionBoundingPath 
{ 
    maskPath = [[UIBezierPath alloc] init]; 
    [maskPath addArcWithCenter:CGPointMake(SLIME_SIZE/2, SLIME_SIZE/2) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO]; 
    return maskPath; 
} 

キー違いはI 2によって、xとyの値を分割して円弧の中心を改変することです

1

物理をデバッグすることです。 iOSユーザーがUIKit Dynamicsを使用して非常に簡単なことをやっているように思う傾向はそれほどありません。これは最近のiOS版の最善の要素の1つで、魅力的なユーザーエクスペリエンスを実現する本当に楽しい方法を提供するため、ちょっと残念です。

だから物理学をデバッグするには?

何が起こっているのかを精神的に想像してから、それを相関させて、想像されたものと実際のものとの間の不協和音を見つけ、その後、排除、精神、 &エラーと控除、問題が決定されて解決されるまで。

もう1つは、要素の性質と範囲、その関係とインシデント/イベントをより迅速に判断し、文字通りの問題を解決するための十分なフィードバックを提示し、作成したすべてのものを視覚的に表現することです。

この目的のため、さまざまなビジュアルデバッガと物理シミュレーションのビルダーが導入されて以来、作成されました。

残念ながら、iOSにはUIKit Dynamicsのようなスクリーンベースのエディタや「シーンエディタ」はなく、Sprite KitとScene Kitのこの種の視覚的なデバッグには基本的には基本的なものがありません。

しかし、すべてのUIKitビューに存在するCALayersがあり、CAShapeLayersを手動で作成して描画し、物理的な要素、境界、アンカー、リレーションシップを正確に表現することができます。

CAShapeLayersは、CGPathsの「コンテナ」であり、アウトラインと塗りつぶしの色が異なり、1つのCAShapeLayer内に複数のCGPath要素があります。

そして、偉大なロブを引用する:

「ビューへのレイヤとしてCAShapeLayerを追加した場合、あなたは にだけCAShapeLayerを追加し、 任意の描画コードを自分で実装する必要はありません。あなたは後でパスを変更することもできます。例えば、 が自動的にそれを再描画します.CashhapeLayerは、あなた自身のdrawRectルーチンやdrawLayerルーチンを作成する雑草である をあなたに送り出します。

あなたが相互作用要素の膨大な数を持っており、それらをデバッグしたい場合は、CAShapeLayerのパフォーマンスの問題は、遊びに来て、あなたがビットマップにそれぞれ変換するshouldRasterizeを使用することができ、その時点で、いつパフォーマンスが大幅に向上する可能性がありますCAShapeLayersの「動的」機能によって作成された制限に打ち勝ちます。

さらに、制約やジョイントのようなものを表現するために、単にプロパティを設定するだけで、CAShapeLayers上に破線を作成する簡単なプロセスがあります。ここでは、CAShapeLayerのプロパティの設定の基本と、配列を使用してブロックストローク、幅3、塗りつぶしなしの破線の輪郭を作成する方法を示します。 UIDynamicItem hereのドキュメントから

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
[shapeLayer setBounds:self.bounds]; 
[shapeLayer setPosition:self.center]; 
[shapeLayer setFillColor:[[UIColor clearColor] CGColor]]; 
[shapeLayer setStrokeColor:[[UIColor blackColor] CGColor]]; 
[shapeLayer setLineWidth:3.0f]; 
[shapeLayer setLineJoin:kCALineJoinRound]; 
[shapeLayer setLineDashPattern: 
[NSArray arrayWithObjects:[NSNumber numberWithInt:10], 
    [NSNumber numberWithInt:5],nil]]; 
関連する問題