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】:检查您在xib
或storyboard
中定义的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 的 UIPageViewController 中的 ViewController 中突出显示
iOS7 AutoLayout UIButton没有收到整个按钮的触摸
UITableViewCell 中的 UIButton 在 iOS7 中不起作用