0

私は ER ダイアグラム エディターを開発しています。ドラッグ可能な UILabels がたくさんありますが、それらはすべて同じ名前です。長押しジェスチャ認識機能を使用して、2 つの UIlabels が一緒に押されたときに、2 つの UIlabels の間に線を作成できるようにしたいと考えています。どんな助けでも大歓迎です

4

1 に答える 1

1

これら 2 つのラベルが共有するスーパービューで長押しジェスチャを作成できます。

UILongPressGestureRecognizer *twoTouchLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                                                                action:@selector(handleLongPress:)];
twoTouchLongPress.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:twoTouchLongPress];

その後、ジェスチャー ハンドラーを記述できます。

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
{
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        CGPoint location0 = [gesture locationOfTouch:0 inView:gesture.view];
        CGPoint location1 = [gesture locationOfTouch:1 inView:gesture.view];

        if ((CGRectContainsPoint(self.label0.frame, location0) && CGRectContainsPoint(self.label1.frame, location1)) ||
            (CGRectContainsPoint(self.label1.frame, location0) && CGRectContainsPoint(self.label0.frame, location1)))
        {
            NSLog(@"success; draw your line");
        }
        else
        {
            NSLog(@"failure; don't draw your line");
        }
    }
}

更新されたコメントでは、ローカルUILabel変数を作成し、結果のラベルをビューに追加することを提案しています。それは問題ありませんが、実際には、ビューで行っていることをキャプチャするバッキング モデルを維持する必要があります。簡単にするために、これらのラベルの配列があると仮定しましょう。

@property (nonatomic, strong) NSMutableArray *labels;

次に、ある時点で初期化します(例viewDidLoad):

self.labels = [[NSMutableArray alloc] init];

次に、ビューにラベルを追加するときに、それらへの参照を配列に追加します。

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(xVal, yVal, 200.0f, 60.0f)]; 
label.text = sentence; 
label.layer.borderColor = [UIColor blueColor].CGColor;
label.layer.borderWidth = 0.0; 
label.backgroundColor = [UIColor clearColor]; 
label.font = [UIFont systemFontOfSize:19.0f];
[self.view addSubview:label];

[self.labels addObject:label];

次に、ジェスチャーで次のようなことができます。

- (UILabel *)labelForLocation:(CGPoint)location
{
    for (UILabel *label in self.labels)
    {
        if (CGRectContainsPoint(label.frame, location))
            return label;                                // if found one, return that `UILabel`
    }
    return nil;                                          // if not, return nil
}

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture
{
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        CGPoint location0 = [gesture locationOfTouch:0 inView:gesture.view];
        CGPoint location1 = [gesture locationOfTouch:1 inView:gesture.view];

        UILabel *label0 = [self labelForLocation:location0];
        UILabel *label1 = [self labelForLocation:location1];

        if (label0 != nil && label1 != nil && label0 != label1)
        {
            NSLog(@"success; draw your line");
        }
        else
        {
            NSLog(@"failure; don't draw your line");
        }
    }
}

率直に言って、私はこれが適切なモデルに裏打ちされているのを見たいと思っていますが、それは単純なスタックオーバーフローの回答の範囲を超えたより複雑な会話です. しかし、うまくいけば、上記があなたにそれがどのように見えるかについてのアイデアを与えるでしょう. (ところで、私は Xcode の助けを借りずに上記を入力しただけなので、事前にタイプミスをお詫びします。)

于 2013-07-15T01:38:53.553 に答える