我已在我的计划中实施了GMGridview。我在github上找到了这段代码。点击here 我的程序是我的业务的网格视图'产品。每个产品都是滚动视图中的自定义UIButton。我正在寻找获得每个按钮(这是产品)的位置的方法,但每次我点击不同的按钮,它仍然给我相同的位置。我不明白为什么会这样。它应该检测我点击的按钮。
我使用此代码获取位置:
CGPoint myPoint = CGPointMake (senderButton.frame.origin.x, senderButton.frame.origin.y);
CGPoint angelPoint= [senderButton.superview convertPoint:myPoint toView:self.view];
我也研究了这个问题的一些解决方案,但在这种情况下它对我没有用。
谢谢。
答案 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
方法。