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

您可以在 GMGridView 中编辑该tapGestureUpdated方法,以便它将您的点击位置(在您的按钮坐标中)传递给您的委托方法:

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在您的视图控制器中实现的方法。

于 2012-09-18T06:55:17.357 回答