UIButton 没有在 iOS7 的 UIPageViewController 中的 ViewController 中突出显示

Posted

技术标签:

【中文标题】UIButton 没有在 iOS7 的 UIPageViewController 中的 ViewController 中突出显示【英文标题】:UIButton is not Highlighting within ViewController in UIPageViewController in iOS7 【发布时间】:2014-02-28 10:52:55 【问题描述】:

我在视图控制器中有一个UIButton,它嵌入在UIPageViewController 中。页面视图控制器处于滚动模式(所以没有手势)。当我触摸按钮时,将调用操作方法,但按钮没有发生可见的状态更改(突出显示状态)。这意味着按钮看起来像未动过。仅在 ios7 中观察到。有什么解决方法吗?

案例 1:在普通 ViewController 中,带有和不带有 Tap 的 Button 的行为

案例 2:在 PageViewController 的 viewController 之一中,带有和不带有 Tap 的 Button 的行为

【问题讨论】:

你使用UIButtonTypeSystem按钮吗?您是否配置突出显示状态?这个问题在新的独立项目中是否可以重现? 【参考方案1】:

这通常发生在您将按钮放入 UIScrollView 时。 UIScrollView 有一个名为“dalaysContentTouches”的属性,默认为 YES。如果是 YES,那么按钮上的触摸将被延迟(以便有时间检查它是否是滚动手势),因此您不会看到突出显示发生。不过,如果您点击它,它会注册为按下按钮,而不会突出显示。

我不确定您的设置到底是什么,但这似乎是一个类似的问题。检查 UI 中涉及的所有手势识别器,并检查“delaysTouchesBegan”和“delaysTouchesEnded”的值。

**经过实验修改**

我刚刚在 iOS 7.0 上尝试过,似乎成功了。

-(void)viewDidAppear:(BOOL)animated 
    NSArray *subviews = self.pageViewController.view.subviews;
    NSArray *viewHierarchy = [@[self.pageViewController.view] arrayByAddingObjectsFromArray:subviews];
    int i = 0;
    for (UIView *viewToCheck in viewHierarchy) 
        for (UIGestureRecognizer *gestureRecognizer in viewToCheck.gestureRecognizers) 
            NSLog(@"%d gestureRecognizer: %@", i++, gestureRecognizer);
            gestureRecognizer.delaysTouchesBegan = NO;
        
    

我得到这个输出

0 gestureRecognizer: <UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x8e9b510; state = Possible; delaysTouchesBegan = YES; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=delayed:, target=<_UIQueuingScrollView 0x9b7f800>)>>
1 gestureRecognizer: <UIScrollViewPanGestureRecognizer: 0x8e9ba10; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x9b7f800>)>; must-fail = 
        <UIScrollViewPagingSwipeGestureRecognizer: 0x8e9bec0; state = Possible; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x9b7f800>)>>
    >
2 gestureRecognizer: <UIScrollViewPagingSwipeGestureRecognizer: 0x8e9bec0; state = Possible; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x9b7f800>)>; must-fail-for = 
        <UIScrollViewPanGestureRecognizer: 0x8e9ba10; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x9b7f800>)>>
    >

其中显示了一个 UIScrollViewDelayedTouchesBeganGestureRecognizer,它似乎是 PageController 的自定义识别器,旨在对您的按钮执行此操作...

但是!将其 delaysTouchesBegan 属性设置为 NO,按钮高亮显示在按下时立即显示。希望这对你也有用。

【讨论】:

我们如何从 UIPageViewController 获取手势(滚动模式的手势为空)也不会暴露它正在使用的滚动视图。 我想你会在 pageViewController.view 找到它? 应该调用[super viewDidAppear:animated];【参考方案2】:

检查您在xibstoryboard 中定义的UIButton 状态(但既然您说它只在iOS7 中,应该没问题)

检查,在您的 IBAction 方法中单击后您的 Button 具有哪个状态

尝试在 IBAction 方法中设置您推荐的 Button 状态

yourButton.higlighted = YES;

//or yourButton.selected = YES; setting selected state 

【讨论】:

【参考方案3】:

同样的问题,我遇到了UITableViewController。我不确定它是否适用于 UIPageViewController,但希望它会有所帮助。

self.PageView.delaysContentTouches = NO;

在 ViewController 中:

for (id obj in self.View.subviews)
    
        if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"])
        
            UIScrollView *scroll = (UIScrollView *) obj;
            scroll.delaysContentTouches = NO;
            break;
        
    

【讨论】:

【参考方案4】:

尝试使用与按钮关联的IBAction 方法中的代码将按钮状态设置为突出显示。

Button.higlighted = YES;

或者您可以在您的操作方法中单击按钮时使用选定状态

[button setSelected:YES];

【讨论】:

【参考方案5】:
UIColor *textColorHighlighted=[UIColor blackColor] ;

[_button setTitleColor:textColorHighlighted forState:UIControlStateHighlighted];

【讨论】:

【参考方案6】:

我不知道人们是否还会看到这篇文章,但我看到了,我花了很多时间试图找到解决方案,我终于做到了,所以对于有同样问题并使用 Swift 工作的人来说,这对我有用:

Swift 3.1:

override func viewDidLoad() 
    super.viewDidLoad()
    let views = view.subviews

    for view in views 

        if let scrollView = view as? UIScrollView 
            scrollView.delaysContentTouches = false
        
    

【讨论】:

以上是关于UIButton 没有在 iOS7 的 UIPageViewController 中的 ViewController 中突出显示的主要内容,如果未能解决你的问题,请参考以下文章

UIButton没有在ios7上注册

UIButton 没有在 iOS7 的 UIPageViewController 中的 ViewController 中突出显示

iOS7 AutoLayout UIButton没有收到整个按钮的触摸

UITableViewCell 中的 UIButton 在 iOS7 中不起作用

UIButton 在 iOS 7 的兼容模式下没有获得 iOS 6 样式

iOS7 UIButton图像闪烁