iOS7中UIPageViewController中的ViewController中的UIButton没有高亮显示

18
在一个嵌入到 UIPageViewController 中的视图控制器中,我有一个 UIButton。 页面视图控制器处于滚动模式(因此没有手势操作)。 当我点击按钮时,会调用操作方法,但是按钮没有可见的状态更改(高亮状态)。 这意味着按钮看起来像未触摸过。 只在 iOS7 中观察到。 有什么解决方法吗? 在常规视图控制器中,按钮在有和没有点击时的行为如下:图片1和图片2。 在 PageViewController 的视图控制器之一中,按钮在有和没有点击时的行为如下: 图片3和图片4。

你使用 UIButtonTypeSystem 按钮吗?你配置了高亮状态吗?这个问题在新的隔离项目中可以重现吗? - vokilam
6个回答

16

当你在UIScrollView中放置一个按钮时,通常会出现这种情况。UIScrollView有一个名为“delaysContentTouches”的属性,默认值为YES。如果它是YES,则按下按钮的触摸将被延迟(以便检查是否为滚动手势),因此您看不到突出显示的效果。尽管如此,如果您轻击它,则会注册为按钮按下,而不会被突出显示。

我不确定您的设置具体是什么,但似乎存在类似问题。检查涉及UI的任何gestureRecognizers,并检查“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,按钮高亮显示就会立即出现。希望这个方法也适用于你。


1
我们如何从UIPageViewController获取手势(对于滚动模式,手势为空),同时它不会公开它正在使用的scrollView。 - Yatheesha
我认为你会在 pageViewController.view 找到它。 - Paul Bruneau
1
应该调用 [super viewDidAppear:animated]; - JYC

1
  • 检查您在xibstoryboard中定义的UIButton状态(但是由于您说它只在iOS7中,所以不应该有问题)

  • 检查您的IBAction方法中单击后按钮的状态

  • 尝试在IBAction方法中设置您推荐的按钮状态

    yourButton.higlighted = YES;
    
    //或者yourButton.selected = YES;设置选定状态
    

1
我曾经遇到与UITableViewController相同的问题。我不确定它是否适用于UIPageViewController,但希望能有所帮助。
self.PageView.delaysContentTouches = NO;

在视图控制器中:
for (id obj in self.View.subviews)
    {
        if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"])
        {
            UIScrollView *scroll = (UIScrollView *) obj;
            scroll.delaysContentTouches = NO;
            break;
        }
    }

1
尝试使用与按钮相关的IBAction方法中的代码将按钮状态设置为高亮。
Button.higlighted = YES;

或者您可以在操作方法中使用选定状态,当按钮被点击时。
[button setSelected:YES];

0
UIColor *textColorHighlighted=[UIColor blackColor] ;

[_button setTitleColor:textColorHighlighted forState:UIControlStateHighlighted];

0

我不知道人们是否还会遇到这篇文章,但我遇到了,并花费了很多时间寻找解决方案,最终我找到了,所以对于那些在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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接