在我的iPhone应用程序中,我想实现如下所示的功能
用户可以从一个视图中选择一个形状(图像)并放入其他视图
我怎样才能做到这一点?
请帮助并建议。
感谢。
答案 0 :(得分:6)
最简单的方法是使用UIPanGestureRecognizer。这将在移动视图和删除视图时为您提供消息。移动时,更新其中心。删除时,检查其位置是否在要放入的视图范围内。(您可能需要将坐标转换为目标视图的坐标系。)如果是,请执行相应的操作。
答案 1 :(得分:5)
答案 2 :(得分:2)
您可以参考上一篇文章,它肯定会帮助您实现此功能...
对于以上所有链接,您必须记住,您需要首先获得任何Control的TouchesBegin
事件,然后您必须获得TouchesMoved
事件以进行相同的控制。
在TouchesMoved
事件中,您只需要获取Control的中心点(CGPoint)。当您释放时,控件将设置为CGPoint
。如果这会产生问题,那么您可以在变量中使用CGPoint
并在TouchesEnded
事件中设置该点。
对于您的情况,我认为您必须维护视图的层次结构 ...否则拖动视图时可能看不到...
更多编码部分:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%f,%f", self.center.x, self.center.y);
CGPoint newLoc = CGPointZero;
newLoc = [self.mainView convertPoint:[[touches anyObject] locationInView:self.superview] toView:self.superview];
float newX = newLoc.x + self.superview.frame.origin.x + (self.frame.size.width /2) + [[touches anyObject] locationInView:self].x ;
float newY = newLoc.y - (((UIScrollView *)self.superview).contentOffset.y *2) ;
NSLog(@"content offset %f", ((UIScrollView *)self.superview).contentOffset.y);
self.scrollParent.scrollEnabled = NO;
NSLog(@"%f,%f", self.center.x, self.center.y);
newLoc = CGPointMake(newX, newY);
[self.superview touchesCancelled:touches withEvent:event];
[self removeFromSuperview];
NSLog(@"%f,%f", self.center.x, self.center.y);
self.center = CGPointMake(newLoc.x, newLoc.y);
[self.mainView addSubview:self];
NSLog(@"%f,%f", self.center.x, self.center.y);
[self.mainView bringSubviewToFront:self];
isInScrollview = NO;
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[UIView beginAnimations:@"stalk" context:nil];
[UIView setAnimationDuration:.001];
[UIView setAnimationBeginsFromCurrentState:YES];
UITouch *touch = [touches anyObject];
self.center = [touch locationInView: self.superview];
[UIView commitAnimations];
if ((self.center.x + (self.frame.size.width / 2)) > 150 && hasExitedDrawer && !self.scrollParent.dragging ) {
self.scrollParent.scrollEnabled = NO;
[self.delegate moveItemsDownFromIndex: ((self.center.y + (self.scrollParent.contentOffset.y)) / 44) + 1 ];
//NSLog(@"%i", ((self.center.y + (self.scrollParent.contentOffset.y *2)) / 44) + 1);
}
if (self.center.x + (self.frame.size.width / 2) < 150) {
hasExitedDrawer = YES;
}
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if ((self.center.x + (self.frame.size.width / 2)) > 150 && hasExitedDrawer && !self.scrollParent.dragging ) {
CGPoint newLoc = CGPointZero;
newLoc = [self.scrollParent convertPoint:[[touches anyObject] locationInView:self.superview] toView:self.superview];
float newY = newLoc.y + (self.scrollParent.contentOffset.y *2);
[self.scrollParent insertSubview:self atIndex:((self.center.y + (self.scrollParent.contentOffset.y)) / 44) ];
self.frame = CGRectMake(0, newY, self.frame.size.width, self.frame.size.height);
isInScrollview = YES;
hasExitedDrawer = NO;
}
}
这段代码可能包含一些无关紧要的内容,但会给你更多的想法...
答案 3 :(得分:1)
您可以使用以下开源库:
答案 4 :(得分:1)
Adding drag and drop component to iOS app问题
我想在Amazon,Flip kart等大多数购物应用中构建像添加到购物车之类的功能。
答案 5 :(得分:-2)
三步解决方案
1)你必须实施/听取触摸事件
2)实现拖动和触摸事件
3)然后管理movetosuperview方法。