复制iOS的仪表板应用按钮,一个带有长按手势识别器的按钮

Posted

技术标签:

【中文标题】复制iOS的仪表板应用按钮,一个带有长按手势识别器的按钮【英文标题】:Replicate iOS's dashboard app button, a button with a long press gesture recognizer 【发布时间】:2016-04-28 13:23:24 【问题描述】:

我一直在尝试复制 iPhone 仪表板主屏幕上的按钮。我想要达到的目标如下:

一个简单的按钮,带有图像及其所有 UIButton 属性。 最重要的是,长按手势识别器。长按时,按钮会抖动,但您仍然可以使用它。

我已经设法做到了所有这些,但我面临以下问题,Apple 可以解决这个问题,而我(还)不能:

在正常点击时,操作系统会稍等片刻以确保它不是长按、双击或任何我猜的。在等待足够长的时间之前,它无法确定这不是一个特殊的手势。因此,每次点击该按钮都会被注册,但一切都会延迟大约 1.5 秒。

这是非常糟糕的用户体验,但是当我在主屏幕上点击一个应用程序时,它是瞬间的(即使应用程序被杀死)。但是,如果我长按,它会正确注册。

我的没有。我在这里俯瞰什么?

我有这个:

两个 UIButtons 稍微重叠,想象一下应用程序图标和角落上的“删除应用程序”按钮。 (蓝色和紫色)​​ 正好包含这两个 UIButton 的 UIView。 (绿色) 该 UIView 上的 UILongPressGestureRecognizer(未显示)

只有在手势达到“开始”状态时才会调用长手势代码,就像主屏幕上的 ios 行为一样。在这个过程的早期阶段。

我试过摆弄不同的属性和设置,但我无法让它工作。你们中有人做到了吗?正确的设置是什么?

【问题讨论】:

仪表板我假设你的意思是跳板。您已经确定了响应问题,即 UIButton 上的长按识别器。 IMO 会更好,从延迟的角度来看,只使用按钮而不使用手势。利用按钮带来的事件。在着陆时启动一个计时器,该计时器将触发图像更改并开始摇摆效果。如果计时器尚未触发,则在内部触摸或外部触摸拖动事件会使计时器无效。使用边缘插图来适应图像随图标徽章的变化。 【参考方案1】:

您可以使用 UIButton TouchDown 和 TouchUpInside 事件来实现。

BOOL touchInProgress;

[self.button addTarget:self action:@selector(touchStart:) forControlEvents:UIControlEventTouchDown];
[self.button addTarget:self action:@selector(touchEnd:) forControlEvents:UIControlEventTouchUpInside];

- (void)touchStart:(id)sender 
    touchInProgress=YES;
    [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(longTouch) userInfo:nil repeats:NO];


- (void)touchEnd:(id)sender 
    if (touchInProgress) 
        [self openIcon];
    
    touchInProgress=NO;




- (void)longTouch 
    if (touchInProgress) 
        [self deleteIcon];
    
    touchInProgress=NO;



- (void)openIcon 



- (void)deleteIcon 


希望这会有所帮助。

【讨论】:

以上是关于复制iOS的仪表板应用按钮,一个带有长按手势识别器的按钮的主要内容,如果未能解决你的问题,请参考以下文章

长按手势识别器产生重复位置 (SWIFT)

ios手势识别之长按

UIAlertView 警报在长按手势识别器中重复三次

UIAlertView 警报在长按手势识别器中重复三次

带有手势识别器的 UICollectionView

UIButton上的长按手势识别器?