- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我正在开发的 iOS 应用程序,用户设备上的所有图像都显示在屏幕的一部分上。用户应该能够将这些图像拖到屏幕的另一部分,以将它们添加到将在内存游戏中使用的图像集中。
这是一个屏幕截图,以防我的解释难以形象化
当用户拖动图像时,我希望发生的是创建该图像的稍小的半透明版本,然后将其拖到底部,但原始图像保留在那里。我可以很好地生成新图像,甚至可以指定一个移动新图像的目标。我遇到的问题是为了拖动新图像,用户必须将手指从屏幕上移开并再次开始拖动。我希望新图像接管旧图像拖动事件。这是我现在拥有的代码。
UIControl *mask = [[UIControl alloc]initWithFrame:frame];
[mask addSubview:img];
[mask addTarget:self action:@selector(dragExited:withEvent:) forControlEvents:UIControlEventTouchDragExit];
[scrImages addSubview:mask];
-(IBAction)dragExited:(id)sender withEvent:(UIEvent*)event
{
UIControl *control = sender;
[control resignFirstResponder];
UIImageView *img = [control.subviews objectAtIndex:0];
CGPoint point = [[[event allTouches]anyObject]locationInView:self.view];
UIControl *mask = [[UIControl alloc]initWithFrame:CGRectMake(0, 0, img.image.size.width, img.image.size.height)];
mask.center = point;
[mask addSubview:[[UIImageView alloc]initWithImage:img.image]];
[mask addTarget:mask action:@selector(removeFromSuperview) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:mask];
[mask addTarget:self action:@selector(thumbnailMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[mask touchesMoved:nil withEvent:nil];
}
-(IBAction)thumbnailMoved:(id)sender withEvent:(UIEvent*)event
{
UIControl *control = sender;
CGPoint point = [[[event allTouches]anyObject]locationInView:self.view];
control.center = point;
}
我试图通过调用 [mask touchesMoved:nil withEvent:nil];
来启动拖动过程,但这似乎不起作用。有什么想法吗?
最佳答案
我将用不同的技巧来回答这个问题,pan gestures .我没有使用你的技术,所以我不能说,但我一直在使用以下内容:
UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanImage:)];
image01.userInteractionEnabled = YES;
[self.image01 addGestureRecognizer:pan];
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanImage:)];
image02.userInteractionEnabled = YES;
[self.image02 addGestureRecognizer:pan];
然后我有了处理程序:
- (void)handlePanImage:(UIPanGestureRecognizer *)sender
{
static CGPoint originalCenter;
static UIImageView *imageview;
if (sender.state == UIGestureRecognizerStateBegan)
{
UIImageView *selectedImageView = (UIImageView *) sender.view;
imageview = [[UIImageView alloc] initWithFrame:selectedImageView.frame];
imageview.image = selectedImageView.image;
imageview.alpha = 0.8;
[sender.view.superview addSubview:imageview];
originalCenter = imageview.center;
}
else if (sender.state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [sender translationInView:sender.view.superview];
imageview.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
[imageview removeFromSuperview];
imageview = nil;
CGPoint translation = [sender translationInView:sender.view.superview];
// do whatever you want to at the end, in this case, animating the moving
// of the old image to the new location. perhaps you don't want to move your
// old image, but leave it there, maybe you just want to change the alpha of
// what you dragged back to 1.0 and snap it into place. Just do whatever you
// want here. Note, in this latter scenario, if you want to be able to drag
// the new image back out, you'll have to create a new pan gesture recognizer
// for it.
[UIView animateWithDuration:0.2
animations:^{
sender.view.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);;
}];
}
else if (sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed)
{
[imageview removeFromSuperview];
imageview = nil;
}
}
您也可以不为每个图像创建一个新的手势识别器,只需在父 View 上创建一个,检测您正在处理的图像,然后继续。这可能看起来像:
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanSuperView:)];
[self.view addGestureRecognizer:pan];
然后:
- (void)handlePanSuperView:(UIPanGestureRecognizer *)sender
{
static CGPoint originalCenter;
static UIImageView *selectedImageView = nil;
static UIImageView *draggedImageView = nil;
if (sender.state == UIGestureRecognizerStateBegan)
{
selectedImageView = nil;
CGPoint location = [sender locationInView:sender.view];
for (UIImageView *imageview in _imageviews)
{
if (CGRectContainsPoint(imageview.frame, location))
selectedImageView = imageview;
}
if (selectedImageView)
{
draggedImageView = [[UIImageView alloc] initWithFrame:selectedImageView.frame];
draggedImageView.image = selectedImageView.image;
draggedImageView.alpha = 0.8;
[sender.view addSubview:draggedImageView];
originalCenter = selectedImageView.center;
}
}
else if (sender.state == UIGestureRecognizerStateChanged && selectedImageView)
{
CGPoint translation = [sender translationInView:sender.view];
draggedImageView.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);
}
else if (sender.state == UIGestureRecognizerStateEnded && selectedImageView)
{
[draggedImageView removeFromSuperview];
draggedImageView = nil;
CGPoint translation = [sender translationInView:sender.view];
// do whatever you want to at the end, in this case, animating the moving of the old image
[UIView animateWithDuration:0.2
animations:^{
selectedImageView.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);;
}];
}
else if ((sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed) && selectedImageView)
{
[draggedImageView removeFromSuperview];
draggedImageView = nil;
}
}
关于ios - 重定向 UIControl 上的拖动事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587190/
我正在制作一个自定义 iOS 键盘,并有一个 UIControl 子类来表示我的按钮。我试图获得与普通 iOS 键盘相同的行为: 用户开始触摸一个按钮 用户拖动其他按钮(需要检测到这一点,以便他们可以
这是设置:我在表格单元格中有 UIControls,允许从右向左滑动以实现删除功能(如清除) 表格单元格位于 UITableView 中。 TableView 位于另一个 UIControl 中,该
我做了一些关于自旋转的实验。情况:我有一个 TabBar 4(选项卡),三个应该只是纵向。最后一个是 UINavigationController,它本身不应自动旋转任何堆叠的 Controller
我有一个名为 CheckboxView 的 UIControl 自定义子类,当用户点击矩形时,它只是在矩形内绘制一个复选标记。这是作为一个单元格添加到 tableView 中的,它位于主容器 Attr
我注意到,当控件是其他控件的子控件并且部分位于父控件边界之外时,仍然可以看到控件在父控件边界之外的部分。 例如,我将一个图像放置在一个网格内,部分放置在网格边界之外,但该图像仍然完整显示。 如何将要显
我尝试以编程方式将 UITableView 添加到 ScrollView 中。我已经设置了 anchor 和数据源,委托(delegate)。你可以在代码中看到。但我不能。我放了一个断点,一切都运行了
Documentation of UIControl Class : UIControlEventTouchDragInside、UIControlEventTouchDragEnter、UICont
我有两个自定义 UIControl。这些是滚轮。 它们的框架重叠。在屏幕截图中,左上角的那个在右边那个后面。当在重叠区域内启动触摸时,如何在左侧开始跟踪? 我的 beginTrackingWithTo
我创建了第 3 方键盘,并尝试为我的按键添加背景。我使用 UIControl 作为我的键,没有 Storyboard。 我有几种类型的按钮,并尝试为我的角色添加背景 UIView。 let img =
我正在创建 GUI,我希望在那里有输入和结果。 我有 text 字段作为标签,edit 或 popup 用于输入。当我有 uicontrol('style','text','string','foo'
我有一个 UIControl 子类。我使用以下代码更改它的背景颜色: - (void)drawRect:(CGRect)rect { [self.backgroundColor setFill
我有一个 UIControl,它实现了 touches begind 方法,如下所示: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent
我不想要 UIButton 或类似的东西。我想直接继承 UIControl 并制作我自己的非常特殊的控件。 但由于某种原因,我覆盖的任何方法都没有被调用。目标 Action 的东西有效,目标接收适当的
我的自定义子类扩展 UIControl (EditableImageView)基本上它包含 3 个 subview : UIButton(UIButtonTypeCustom) UIImageView
我目前有一个 UIControl,它有许多 subview (图像、标签)。 不幸的是,当我使用 addTarget 等时,它不会检测到 subview 上的触摸。 [myCustomView a
基本上我需要一个图像按钮,特别是一个自定义对象: 1) 点击时调用 Controller 的操作 2)封装自定义数据 3)由包装 View 自动移动(不相关) 好吧,我通过 UIControl 的子类
我可以在短时间内禁用按钮吗?我有一个注册 View ,在 3 次错误尝试时,它会将用户带到注册 View 之外,并且会在一段时间内禁用注册按钮,比如 5 分钟。是否可以? 最佳答案 - (void)
我已经构建了一个 UIControl 子类来显示 1 个月的日历 View 一部 iPhone。大多数月份需要 5 周才能显示日期,但 有些月需要 6,所以我建立了动态调整大小的控件 自己根据需要
我创建了一个名为“TestButton”的 UIControl 子类,带有标签和 imageview subview 。该对象是使用框架创建的,作为初始化过程的一部分,我创建了 subview 元素。
堆栈溢出, 我正在努力扩展 UIControl 以为其自身分配单个值。实现这一点是为了它可以在启动时分配一个值以实现持久性。我的目标是尽可能普遍地做到这一点,以便它可以轻松扩展。我的方法的主要组成部分
我是一名优秀的程序员,十分优秀!