1

さまざまな方向にいくつかの線が描かれたビューがあります。ユーザーがどの行をタップしたかを判断し、それに応じて応答する必要があります。

私の頭の中にはいくつかの異なるアイデアがありますが、これを行うための最良で最も効率的な方法が必要です...

最終的に私にとって最も理にかなっているのは、各行を別々のビューに配置し、個々のオブジェクトのように扱うことです。これを行った場合、線が正確に位置するようにビューを配置および回転する必要があるので、いつタップされたかがわかりますか?そうでない場合は、ビューが互いに重なり合って、どの行がタップされたかを判別できないと思います。

私は理にかなっていると思います。これを達成するための最良の方法を教えてください。ありがとう!

4

2 に答える 2

5

私にとってこれに取り組む最良の方法は、UIViewを行として作成することです。単純に無地の線である場合は、背景ビューを使用し、それに応じてCGRectFrameを設定します。

位置などを処理せずにタッチイベントに反応するには、次のようにUIViewのinitメソッドでtouchEventを作成します。

UITapGestureRecognizer *onTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lineClicked)];
 [self addGestureRecognizer:onTap];   

UIViewクラス内で関数を宣言します。

-(void)lineClicked {
  //You can check some @property here to know what line was clicked for example
  if (self.color == [UIColor blackColor])
      //do something
  else
      //do another thing

  // You can use a custom protocol to tell the ViewController that a click happened
  (**) if ([self.delegate respondsToSelector:@selector(lineWasClicked:)]) {
         [self.delegate lineWasClicked:self];
     }
}

(**)行をクリックした後、viewControllerにロジックを配置することをお勧めします。これにアプローチする最良の方法は、CustomUIView.hファイルで@protocolを宣言し、パラメーターとしてselfを渡して、viewControllerが誰がクリックされたかを認識できるようにすることです。

@protocol LineClikedDelegate <NSObject>
@optional
- (void)lineWasClicked:(UIView *)line; //fired when clicking in the line
@end

最後に、CustomUIViewに@propertyを作成して、デリゲートをポイントします。

@property id<DisclosureDelegate> delegate;

そしてViewControllerで。UIViewとして行を作成する場合は、次のようにデリゲートを設定します。

blackLine.delegate = self.

- (void)lineWasClicked:(UIView *)line;ViewControllerにメソッドを実装すると、設定が完了します。

于 2013-03-18T17:03:44.083 に答える
1

要求に応じて、これを回答として追加します。

線を表示するために、ビューの代わりにレイヤーを使用できます。これは描画に効率的であり、どの線がタップされたかを判断するためのヒットテストを可能にします。

ジオメトリ計算のコードは次のとおりです。

于 2013-03-18T21:31:53.113 に答える