我在视图控制器中有一个UIButton
,它嵌入在UIPageViewController
中。页面视图控制器处于滚动模式(所以没有手势)。当我触摸按钮时,将调用操作方法,但按钮不会发生可见的状态更改(突出显示状态)。这意味着按钮看起来没有动过。仅在iOS7中观察到。有什么解决方法吗?
案例1:在普通ViewController中使用和不使用Tap的行为
案例2:在其中一个PageViewController的viewController中,带有和不带Tap的Button的行为
答案 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)
检查UIButton
或xib
中定义的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
}
}
}