gpt4 book ai didi

iphone - 如何在仍然按住手指的同时从使用一个 UIButton 切换到另一个?

转载 作者:可可西里 更新时间:2023-11-01 04:42:23 24 4
gpt4 key购买 nike

想象一下您的键盘。想象一下,您将一根手指放在一个键上,然后(在按住的同时)将手指一直移动到键盘上的另一个键上。现在,假设键盘上的每个键都是一个 UIButton。当您将手指放在当前键上时,此键 (UIButton) 会突出显示。然后,当用户移动到另一个键时,第一个键不再突出显示,而按下的当前键突出显示。

现在,我有一个 6 x 8 的 UIButton 网格,每个 53 x 53 像素。所以,我有 48 个 UIButtons。我想复制这种想法。用户手指按下的按钮将有一个稍微亮一点的图像(看起来像被选中的样子),而所有其他按钮都不会稍微亮一点。

这是我的想法,

1) 在 viewDidLoad 中创建所有 48 个 UIButtons。将较亮的图像添加到所有 UIButtonsUIControlStateHighlighted

2) 为 touchUpOutside 添加某种 target 以某种方式使当前按钮不突出显示且不可用。 (也许将突出显示和 userInteractionEnabled 设置为 no)。但是我怎么知道要使用下一个按钮呢?我怎么能说我希望用户手指所在的特定 UIButton 变得突出显示并用于检测手势和其他东西。

此外,此 touchUpOutside 方法可能无法正常工作,因为所有按钮都紧挨着彼此,而且我认为您必须拖到很远的地方才能运行此 touchUpOutside

同样重要的是要注意按钮没有放置在相等的行和列中。有时一个按钮实际上是一个 UIImage 但看起来像一个 UIButton。因此,出于某种原因进行某种快速枚举比较帧是行不通的。

最佳答案

两个观察:

  1. 我通常对此类内容使用手势识别器,而不是各种 touchUp... 方法。

  2. 我知道您说过您不想通过 subview 进行快速枚举,但为什么不呢?仅仅因为一些类与其他类不同并不是问题(因为您可以只测试 isKindOfClass 方法)。 (顺便说一句,我不确定为什么有些是按钮而有些不是。)仅仅因为它们没有排成一行也没有什么区别。

无论如何,对于这样的事情,我经常会将手势识别器放在共享父 View (例如,通常是 View Controller 的 View )上,然后枚举 subview 以查看包含当前 CGPoint 的位置?

CGPoint location = [sender locationInView:self.view];

for (UIView *subview in self.view.subviews)
{
if (CGRectContainsPoint(subview.frame, location))
{
// do your appropriate highlighting

if ([subview isKindOfClass:[UIButton class]])
{
// something for buttons
}
else if ([subview isKindOfClass:[UIImageView class]])
{
// something for imageviews
}

return;
}
}

我不知道这对你是否有意义,但对我来说这似乎是最简单的。如果您阐明了您的意图,也许我可以进一步完善我的答案。

作为一个实际的例子,你可以定义一个连续的手势识别器来跟踪第一个和最后一个被点击的 subview (如果你没有在 subview 上开始你的手势,就不会生成手势,如果你不会在 subview 上停止你的手势,它会取消整个事情),例如:

@interface SubviewGestureRecognizer : UIGestureRecognizer

@property (nonatomic,strong) UIView *firstSubview;
@property (nonatomic,strong) UIView *currentSubview;

@end

@implementation SubviewGestureRecognizer

- (id) initWithTarget:(id)target action:(SEL)action
{
self = [super initWithTarget:target action:action];
if (self)
{
self.firstSubview = nil;
self.currentSubview = nil;
}

return self;
}

// you might want to tweak this `identifySubview` to only look
// for buttons and imageviews, or items with nonzero tag properties,
// or recursively navigate if it encounters container UIViews
// or whatever suits your app

- (UIView *)identifySubview:(NSSet *)touches
{
CGPoint location = [[touches anyObject] locationInView:self.view];

for (UIView *subview in self.view.subviews)
{
if (CGRectContainsPoint(subview.frame, location))
{
return subview;
}
}

return nil;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];

if ([touches count] != 1)
{
self.state = UIGestureRecognizerStateFailed;
return;
}

self.firstSubview = [self identifySubview:touches];
self.currentSubview = self.firstSubview;

if (self.firstSubview == nil)
self.state = UIGestureRecognizerStateFailed;
else
self.state = UIGestureRecognizerStateBegan;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];

if (self.state == UIGestureRecognizerStateFailed) return;

self.currentSubview = [self identifySubview:touches];

self.state = UIGestureRecognizerStateChanged;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];

self.currentSubview = [self identifySubview:touches];

if (self.currentSubview != nil)
self.state = UIGestureRecognizerStateEnded;
else
self.state = UIGestureRecognizerStateFailed;
}

- (void)reset
{
[super reset];

self.firstSubview = nil;
self.currentSubview = nil;
}

然后您可以在 viewDidLoad 中进行设置:

SubviewGestureRecognizer *recognizer = [[SubviewGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouches:)];
[self.view addGestureRecognizer:recognizer];

然后这样定义您的处理程序(这适用于按钮和 ImageView ,利用两者都支持 setHighlighted 的事实):

- (void)handleTouches:(SubviewGestureRecognizer *)sender
{
static UIControl *previousControl = nil;

if (sender.state == UIGestureRecognizerStateBegan || sender.state == UIGestureRecognizerStateChanged)
{
if (sender.state == UIGestureRecognizerStateBegan)
previousControl = nil;

UIView *subview = sender.currentSubview;
if (previousControl != subview)
{
// reset the old one (if any)

[previousControl setHighlighted:NO];

// highlight the new one

previousControl = (UIControl *)subview;
[previousControl setHighlighted:YES];
}
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
if (previousControl)
{
[previousControl setHighlighted:NO];
NSLog(@"successfully touchdown on %@ and touchup on %@", sender.firstSubview, sender.currentSubview);
}
}
else if (sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed)
{
[previousControl setHighlighted:NO];
NSLog(@"cancelled/failed gesture");
}
}

关于iphone - 如何在仍然按住手指的同时从使用一个 UIButton 切换到另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11919066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com