UIButton不是在iOS7中的UIPageViewController中的ViewController中突出显示

时间:2014-02-28 10:52:55

标签: ios ios7 uipageviewcontroller

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

案例1:在普通ViewController中使用和不使用Tap的行为

Before tapping After tapping

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

Before tapping enter image description here

6 个答案:

答案 0 :(得分:14)

当您在UIScrollView中放置按钮时,通常会发生这种情况。 UIScrollView有一个名为" dalaysContentTouches"默认为YES。如果是,则按下按钮将被延迟(以便有时间检查它是否是滚动手势),因此您不会看到突出显示发生。不过,如果点击它,它会注册为按钮按下,而不会突出显示。

我不确定你的设置是什么,但它似乎是一个类似的问题。检查UI中涉及的任何gestureRecognizer,并检查" delaysTouchesBegan"的值。和#34; 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 :(得分:1)

  • 检查UIButtonxib中定义的storyboard个州(但由于您说它仅在iOS7中,因此不应该出现问题)

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

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

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

答案 2 :(得分:1)

同样的问题,我面对的是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;
        }
    }

答案 3 :(得分:1)

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

Button.higlighted = YES;

或者您可以在操作方法

中单击按钮时使用所选状态
[button setSelected:YES];

答案 4 :(得分:0)

UIColor *textColorHighlighted=[UIColor blackColor] ;

[_button setTitleColor:textColorHighlighted forState:UIControlStateHighlighted];

答案 5 :(得分: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
        }
    }
}