将拖放组件添加到 iOS 应用程序
Posted
技术标签:
【中文标题】将拖放组件添加到 iOS 应用程序【英文标题】:Adding drag and drop component to iOS app 【发布时间】:2013-07-14 18:19:16 【问题描述】:如果这看起来很含糊,我深表歉意,但我不知道该怎么说。
我正在尝试构建一个 ipad 应用程序,让用户可以使用他们需要的工具填充工作区。我需要一个让用户将组件拖放到应用程序界面中的示例。因此,例如,如果我有一个用户可以制作表单的应用程序,并且我希望用户能够拖动文本框、列表、单选按钮等来制作表单,我将如何去做呢?我正在使用的项目将在弹出菜单中,以便用户向上拖动,然后将在该弹出菜单中看到我需要的所有项目。我只是不确定如何让它们从弹出窗口拖到画布上,并且还能够重复使用相同的项目(因此示例中有 3 或 4 个文本框)。这可能吗?任何人都可以指导我学习这方面的教程吗?我已经搜索但找不到任何东西。
如果这是一个错误的任务或者是一个愚蠢的任务,请告诉我怎么做,这是我第一次在这里发帖。
谢谢
【问题讨论】:
你做到了吗。如果有的话,能否分享一下源代码。提前致谢。 【参考方案1】:已经有很多答案可以解释这个问题。 基本上你可以制作自定义 UIView,它在触摸后将跟随触摸运动。 像这样的:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
_originalPosition = self.view.center;
_touchOffset = CGPointMake(self.view.center.x-position.x,self.view.center.y-position.y);
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
UITouch *touch = [touches anyObject];
CGPoint position = [touch locationInView: self.view.superview];
[UIView animateWithDuration:.001
delay:0.0
options:UIViewAnimationOptionCurveEaseInOut
animations:^
self.view.center = CGPointMake(position.x+_touchOffset.x, position.y+_touchOffset.y);
completion:^(BOOL finished) ];
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
CGPoint positionInView = [touch locationInView:self.view];
CGPoint newPosition;
if (CGRectContainsPoint(_desiredView.frame, positionInView))
newPosition = positionInView;
// _desiredView is view where the user can drag the view
else
newPosition = _originalPosition;
// its outside the desired view so lets move the view back to start position
[UIView animateWithDuration:0.4
delay:0.0
options:UIViewAnimationOptionCurveEaseInOut
animations:^
self.view.center = newPosition
// to
completion:^(BOOL finished) ];
类似问题
iPhone App: implementation of Drag and drop images in UIView
Basic Drag and Drop in ios
iPhone drag/drop
【讨论】:
【参考方案2】:从问题中你将要在亚马逊、Flip kart 等大多数购物应用程序中构建添加到购物车等功能。
- (void)viewDidLoad
[super viewDidLoad];
shoeImageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(46,222, 51 , 51)];
shoeImageView1.image = [UIImage imageNamed:@"shoe.png"];
shoeImageView2 = [[UIImageView alloc]initWithFrame:CGRectMake(150,222, 51 , 51)];
shoeImageView2.image = [UIImage imageNamed:@"shoe1.png"];
shoeImageView3 = [[UIImageView alloc]initWithFrame:CGRectMake(225,222, 51 , 51)];
shoeImageView3.image = [UIImage imageNamed:@"shoe2.png"];
addTOCart = [[UIImageView alloc]initWithFrame:CGRectMake(132,400, 80, 80)];
addTOCart.image = [UIImage imageNamed:@"basket.png"];
[self.view addSubview:addTOCart];
imageViewArray = [[NSMutableArray alloc]initWithObjects: shoeImageView1,shoeImageView2 ,shoeImageView3,nil];
for (int i=0; i<imageViewArray.count; i++)
[self.view addSubview:[imageViewArray objectAtIndex:i]];
[[imageViewArray objectAtIndex:i]setUserInteractionEnabled:YES];
//[self touchesBegan:imageViewArray[i] withEvent:nil];
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
for(int i=0 ; i< imageViewArray.count; i++)
CGPoint pt = [[touches anyObject]locationInView:self.view];
startLocation = pt;
newtemp = [imageViewArray objectAtIndex:i];
UITouch* bTouch = [touches anyObject];
if ([bTouch.view isEqual:newtemp])
firstTouchPoint = [bTouch locationInView:[self view]];
oldX = firstTouchPoint.x - [[bTouch view]center].x;
oldY = firstTouchPoint.y - [[bTouch view]center].y;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
for(int i=0 ; i< imageViewArray.count; i++)
newtemp = [imageViewArray objectAtIndex:i];
//oldLoc = newtemp.frame;
if (CGRectContainsPoint(addTOCart.frame , newtemp.frame.origin))
NSLog(@"touched");
dragging = NO;
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Cart" message:@"Added to Cart" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[[imageViewArray objectAtIndex:i] setImage:[UIImage imageNamed:@""]];
[imageViewArray removeObjectAtIndex:i];
[alert show];
break;
else
//[newtemp setCenter:CGPointMake(startLocation.x-oldX, startLocation.y-oldY)];
// self.view.userInteractionEnabled= NO;
dragging = NO;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
UITouch* mTouch = [touches anyObject];
// if ([mTouch.view isEqual: newtemp])
CGPoint cp = [mTouch locationInView:[self view]];
[[mTouch view]setCenter:CGPointMake(cp.x-oldX, cp.y-oldY)];
//
您可以使用这些代码来实现这些功能。使用这些代码,您可以将对象拖动到屏幕中的任何位置。
对于示例项目,您可以使用this 链接。
【讨论】:
以上是关于将拖放组件添加到 iOS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章