2

プログラムに GMGridview を実装しました。このコードは github で見つけました。ここをクリック 私のプログラムは、私のビジネスの製品のグリッド ビューです各製品は、スクロール ビュー内のカスタム UIButton です。各ボタン(製品)の場所を取得する方法を探していますが、別のボタンをクリックするたびに同じ場所が表示されます。これがなぜなのかわかりません。クリックしているボタンを検出するはずです。

このコードを使用して場所を取得しました。

 CGPoint myPoint = CGPointMake (senderButton.frame.origin.x, senderButton.frame.origin.y); 
 CGPoint angelPoint= [senderButton.superview convertPoint:myPoint toView:self.view];

この問題の解決策もいくつか調査しましたが、この場合はうまくいきませんでした。

ありがとうございました。

4

3 に答える 3

1

グリッド方式でボタンを作成し、それぞれにタグを設定します。

こちらは4ボタンのみ

CGFloat xPoint = 0.0;
    for (int t = 0; t < 4; t ++) {
        UIButton * button = [[UIButton alloc]initWithFrame:CGRectMake(xPoint,0.0,100.0,50.0)];
        [button setTag:t];
        [button addTarget:self action:@selector('your Selector')forControlEvents:UIControlEventTouchUpInside];
        [YOURVIEW addSubview:button];
        xPoint += 100.0;
    }

次に、ビューからタグ付きの各ボタンを抽出します。

    for(int j = 0;j < 4;j++)
    {
        UIButton * removeButton = (UIButton *)[self.view viewWithTag:j];
        NSLog(@"Frame : X:%.2f Y:%.2f Width:%.2f Height:%.2f",removeButton.frame.origin.x,removeButton.frame.origin.x,removeButton.frame.size.width,removeButton.frame.size.height);

        // you can get access each button's frame here...
    }
于 2012-09-17T11:32:59.610 に答える
0

通常、どのボタンをタップしたかを知るために、タップ イベントの座標を計算する必要はありません。実際、senderButton議論はまさにそれを伝えているだけです。tagグリッドを作成するときに各ボタンに値 (シーケンス番号など) を関連付け、アクション ハンドラーでそのタグを使用して、より「論理的な」レベルでボタンを識別することを考えるかもしれません。

元の質問に関しては、コードは問題ないようです。私が見る唯一の潜在的な問題はself.view. それはどのビューを識別しますか? そして、空間内nilの座標を取得するためにパスを試みましたか?UIWindow

于 2012-09-17T08:27:54.577 に答える
0

tapGestureUpdatedGMGridView 内でメソッドを編集して、タップの位置 (ボタンの座標) をデリゲート メソッドに渡すことができます。

GMGridView.h:

#pragma mark Protocol SCLGridViewActionDelegate
@protocol SCLGridViewActionDelegate <NSObject>

@required
- (void)GMGridView:(SCLGridView *)gridView didTapOnItemAtIndex:(NSInteger)index atLocation: (CGPoint) location;
@end

GMGridView.m:

#pragma mark tapgesture
- (void)tapGestureUpdated:(UITapGestureRecognizer *)tapGesture
{
       CGPoint locationTouch = [_tapGesture locationInView:self];
       NSInteger index = [self.layoutStrategy itemPositionFromLocation:locationTouch];

       if (index != kInvalidPosition) 
       {
            CGPoint locationInItem = [_tapGesture locationInView:[self cellForItemAtIndex:index]];
            [self.actionDelegate GMGridView:self didTapOnItemAtIndex:index atLocation:locationInItem];
       }
}

編集

gridView がビュー コントローラーによって管理されるビューの一部であるシナリオにいる場合は、ビュー コントローラーが に準拠していることを確認し、ビュー コントローラーSCLGridViewActionDelegateをアクション デリゲートとして設定します。ビュー コントローラーはyourGridView.actionDelegate = selfどこにselfありますか。次にdidTapInItemAtIndex、View Controller 内に実装されたメソッドを実装しました。

于 2012-09-18T06:55:17.357 に答える