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

时间:2016-04-28 13:23:24

标签: ios uibutton tap long-press uilongpressgesturerecogni

我一直在尝试复制iPhone控制台主屏幕上的按钮。我想要实现的目标如下:

  • 一个简单的按钮,带有图像及其所有UIButton属性。
  • 在它上面,一个长按手势识别器。长按,按钮会震动,但您仍然可以使用它。

我已经成功完成了所有这些,但我面临以下问题,Apple可能会击败,我还不能(还):

在正常的水龙头上,操作系统稍等一下,以确保它不是长按,或双击,或我猜的任何东西。在它等待足够长的时间之前,它无法确定它不是一种特殊的姿势。因此,每个按钮都会被注册,但所有内容都会延迟大约1.5秒。

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

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

我有这个:

Very strange issue in Swift code. Delay to make operations

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

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

我试过摆弄不同的属性和设置,但我无法让它工作。你有没有成功的?什么是正确的设置?

1 个答案:

答案 0 :(得分: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 {

}

希望这有帮助。