54

我在我的应用程序中遇到了一个小问题。

我基本上在作为nib 一部分的 a中添加了一系列UIButtons子视图。UIScrollView每次我点击一个按钮时,在按钮被突出显示之前都会有一个明显的延迟。在按钮变暗并显示为选中之前,我基本上必须按住它大约半秒钟。

我假设这是因为UIScrollView需要确定触摸是滚动还是用于子视图的触摸。

无论如何,我有点不确定如何进行。我只是希望按钮在我点击后立即显示为选中状态。

任何帮助表示赞赏!

编辑:

我尝试设置delaysContentTouchesNO但滚动几乎变得不可能,因为我的大部分 scrollView 都充满了UIButtons.

4

7 回答 7

58

杰夫的解决方案对我来说不太有效,但这个类似的解决方案可以:http: //charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

除了touchesShouldCancelInContentView在滚动视图子类中覆盖之外,您还需要设置delaysContentTouchesfalse. 最后,您需要返回true而不是false按钮。这是来自上述链接的修改示例。正如评论者所建议的那样,它检查任何子类UIControl而不是UIButton专门检查,以便此行为适用于任何类型的控件。

目标-C:

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.delaysContentTouches = false;
    }

    return self;
}

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:UIControl.class]) {
        return true;
    }

    return [super touchesShouldCancelInContentView:view];
}

斯威夫特 4:

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIControl {
        return true
    }
    return super.touchesShouldCancel(in: view)
}
于 2013-10-29T11:10:34.687 回答
40

好的,我已经通过子类化UIScrollView和覆盖解决了这个问题touchesShouldCancelInContentView

现在我的UIButton那个被正确标记为 99 个亮点,我的滚动视图正在滚动!

myCustomScrollView.h

@interface myCustomScrollView : UIScrollView  {

}

@end

myCustomScrollView.m

@implementation myCustomScrollView

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        NSLog(@"touchesShouldCancelInContentView");

        if (view.tag == 99)
            return NO;
        else 
            return YES;
    }
于 2010-09-04T16:24:35.640 回答
28

尝试将 UIScrollViewdelaysContentTouches属性设置为 NO。

于 2010-09-04T14:22:14.167 回答
3

故事板解决方案:选择滚动视图,打开“属性检查器”并取消选中“延迟内容触摸”

在此处输入图像描述

于 2017-01-17T09:54:47.663 回答
2

在斯威夫特 3 中:

import UIKit

class ScrollViewWithButtons: UIScrollView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        myInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        myInit()
    }

    private func myInit() {
        self.delaysContentTouches = false
    }

    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view is UIButton {
            return true
        }
        return super.touchesShouldCancel(in: view)
    }
}

然后,您可以ScrollViewWithButtons在 IB 或代码中使用它。

于 2017-07-21T17:16:59.250 回答
1

斯威夫特 3:

scrollView.delaysContentTouches = false
于 2017-05-27T14:29:05.413 回答
0

现有的解决方案都不适合我。也许我的情况比较独特。

UIButtons在一个UIScrollView. 当UIButton按下 a时UIViewController,会向用户呈现一个新的。如果一个按钮被按下并保持足够长的时间,该按钮将显示其按下状态。我的客户抱怨说,如果您点击太快,则不会显示抑郁状态。

我的解决方案:在UIButtons' tap 方法中,我在其中加载新的UIViewController并将其呈现在屏幕上,我使用

[self performSelector:@selector(loadNextScreenWithOptions:) 
           withObject:options 
           afterDelay:0.]

这会安排在下UIViewController一个事件循环中加载下一个。留出时间UIButton重绘。现在UIButton显示其在加载下一个之前的压抑状态UIViewController

于 2012-07-23T14:58:26.660 回答