在UIScrollView中,UIButton touch会延迟
我在我的应用程序中遇到了一个小问题。
我基本上有一系列的UIButtons
作为子UIScrollView
的一部分UIScrollView
添加为子视图。 每次点击一个button,在button被突出显示之前,都会有明显的延迟。 我基本上必须在button变暗并显示选定之前保持约半秒。
我假设这是因为UIScrollView
需要确定触摸是滚动还是触摸是为子视图。
无论如何,我有点不确定如何进行。 我只是希望button出现被选中,只要我点击它。
任何帮助表示赞赏!
编辑:
我已经尝试将delaysContentTouches
设置为NO,但滚动几乎是不可能的,因为我的scrollView的大部分是充满了UIButtons
。
好吧,我已经通过touchesShouldCancelInContentView
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; }
杰夫的解决scheme不是为我工作,但类似的一个: http : //www.charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state/
不知道是否这是杰夫的答案,但除了覆盖-touchesShouldCancelInContentView:
在你的滚动视图子类,你仍然需要设置delaysContentTouches
为NO
。 最后,不要为你的button返回NO
,你需要返回YES
。 以上链接为例。
- (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.delaysContentTouches = NO; } return self; } - (BOOL)touchesShouldCancelInContentView:(UIView *)view { if ([view isKindOfClass:UIButton.class]) { return YES; } return [super touchesShouldCancelInContentView:view]; }
Swift版本。
override func touchesShouldCancelInContentView(view: UIView!) -> Bool { if view is UIButton { return true } return super.touchesShouldCancelInContentView(view) }
尝试将UIScrollView的delaysContentTouches
属性设置为NO。
现有的解决scheme都不适合我。 也许我的情况更加独特。
我有一个UIScrollView
许多UIButtons
。 当一个UIButton
被按下时,一个新的UIViewController
被呈现给用户。 如果按一个button并保持足够长的时间,button将显示其按下的状态。 我的客户抱怨说,如果你点击的太快,没有显示压低的状态。
我的解决scheme:在UIButtons
的tap方法中,我加载新的UIViewController
并将其呈现在屏幕上,我使用
[self performSelector:@selector(loadNextScreenWithOptions:) withObject:options afterDelay:0.]
这安排在下一个事件循环中加载下一个UIViewController
。 允许时间重绘UIButton
。 在加载下一个UIViewController
之前, UIButton
现在显示了它的低迷状态。
故事板解决scheme:select滚动视图,打开“属性检查器”,并取消选中“延迟内容接触”
Swift 3:
scrollView.delaysContentTouches = false
在Swift 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) } }
然后,您可以在IB或代码中使用此ScrollViewWithButtons
。
- 我可以在UIScrollView中使用UIRefreshControl吗?
- 在embeddedUITableViewCell时,告诉UITextField成为第一个响应者
- 如何使UITableView的高度dynamic与自动布局function?
- 在iOS中的App Delegate中调用当前视图控制器中的方法
- UIStackView支持iOS 8或7吗?
- Xcode 8 / Swift 3:“UIViewControllertypes的expression式? 未使用“警告
- findObjectsInBackgroundWithBlock:从Parse获取数据,但数据只存在于块内
- 如何只允许单个UIViewController在风景和肖像方向旋转?
- Xcode 8不能存档“命令/ usr / bin / codesign失败,退出代码1”