如何查找正在点击的视图的位置(使用GMGridView库)

时间:2012-09-17 08:06:25

标签: objective-c xcode ipad uibutton gmgridview

我已在我的计划中实施了GMGridview。我在github上找到了这段代码。点击here 我的程序是我的业务的网格视图'产品。每个产品都是滚动视图中的自定义UIButton。我正在寻找获得每个按钮(这是产品)的位置的方法,但每次我点击不同的按钮,它仍然给我相同的位置。我不明白为什么会这样。它应该检测我点击的按钮。

我使用此代码获取位置:

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

我也研究了这个问题的一些解决方案,但在这种情况下它对我没有用。

谢谢。

3 个答案:

答案 0 :(得分:1)

以网格方式创建按钮,为每个按钮创建setTag:

这里只有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;
    }

然后从View:

中提取每个按钮的标签
    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...
    }

答案 1 :(得分:0)

通常,您不需要对点按事件的坐标进行计算,以了解您点击了哪个按钮。实际上,senderButton论证只是告诉你这一点。您可能会想到在构建网格时将tag值与每个按钮相关联(例如,序列号),然后在操作处理程序中使用该标记来识别更“逻辑”级别的按钮: / p>

至于你原来的问题,你的代码似乎很好。我看到的唯一潜在问题是self.view。它识别出哪种观点?您是否尝试过nil以便获得UIWindow空间中的坐标?

答案 2 :(得分: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方法。