UIPageControl 无法正确响应点击

Posted

技术标签:

【中文标题】UIPageControl 无法正确响应点击【英文标题】:UIPageControl doesn't properly react to taps 【发布时间】:2012-07-27 17:52:22 【问题描述】:

在我的 TestApp 中,我创建了一个“Carousel”类,它可以让我以一种简单的方式(通过简单地创建 Carousel 类的实例)创建一个带有 UIPageControl 的滑动菜单。

Carousel 是 UIView 的子类 在初始化时,它会创建一个UIView,包含UIScrollView、UIPageControl 我可以向滚动视图添加更多 UIViews

我不知道这是否是正确的方法,但我的示例在我的 TestApp 中运行良好。在页面之间滑动完美,并且 UIPageControl 中当前页面的显示是正确的。

如果没有一个问题: UIPageControl 有时会对点击/点击做出反应(我目前只在模拟器中测试过!),有时不会。让我们说大多数时候它没有。我还不知道它什么时候出现,对我来说这只是随机的......

如下所示,我添加了

[pageControl addTarget:self action:@selector(pageChange:) forControlEvents:UIControlEventValueChanged];

我的代码。我认为这可以正确处理水龙头?但不幸的是,pageChange 并不总是被调用(所以 UIPageControl 的值不会在我每次点击时改变)。

我将不胜感激,因为我还没有找到任何解决方案。

这是我目前所拥有的:

Carousel.h

#import <UIKit/UIKit.h>

@interface Carousel : UIView 
    UIScrollView *scrollView;
    UIPageControl *pageControl;
    BOOL pageControlBeingUsed;


- (void)addView:(UIView *)view;
- (void)setTotalPages:(NSUInteger)pages;
- (void)setCurrentPage:(NSUInteger)current;
- (void)createPageControlAt:(CGRect)cg;
- (void)createScrollViewAt:(CGRect)cg;

@end

Carousel.m

#import "Carousel.h"

@implementation Carousel

- (id)initWithFrame:(CGRect)frame 

    self = [super initWithFrame:frame];

    if (self) 

        // Create a scroll view
        scrollView = [[UIScrollView alloc] init];
        [self addSubview:scrollView];

        scrollView.delegate = (id) self;

        // Init Page Control
        pageControl = [[UIPageControl alloc] init];
        [pageControl addTarget:self action:@selector(pageChange:) forControlEvents:UIControlEventValueChanged];
        [self addSubview:pageControl];

    

    return self;



- (IBAction)pageChange:(id)sender 
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * pageControl.currentPage;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:TRUE];
    NSLog(@"%i", pageControl.currentPage);


- (void)addView:(UIView *)view 
    [scrollView addSubview:view];


- (void)createPageControlAt:(CGRect)cg 
    pageControl.frame = cg;


- (void)setTotalPages:(NSUInteger)pages 
    pageControl.numberOfPages = pages;


- (void)setCurrentPage:(NSUInteger)current 
    pageControl.currentPage = current;


- (void)createScrollViewAt:(CGRect)cg 
    [scrollView setPagingEnabled:TRUE];
    scrollView.frame = cg;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width*pageControl.numberOfPages, scrollView.frame.size.height);
    [scrollView setShowsHorizontalScrollIndicator:FALSE];
    [scrollView setShowsVerticalScrollIndicator:FALSE];



- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

    float frac = scrollView.contentOffset.x / scrollView.frame.size.width;
    NSUInteger page = lround(frac);
    pageControl.currentPage = page;



@end

ViewController.m(在 viewDidLoad 中的某处)

Carousel *carousel = [[Carousel alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];

for (int i=0; i<5; i++) 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i * 320, 0, 320, 420)];
    UIColor *color;
    if(i%3==0) color = [UIColor blueColor];
    else if(i%3==1) color = [UIColor redColor];
    else color = [UIColor purpleColor];
    view.backgroundColor = color;
    [carousel addView:view];
    view = nil;


[carousel setTotalPages:5];
[carousel setCurrentPage:0];

[carousel createPageControlAt:CGRectMake(0,420,320,40)];
[carousel createScrollViewAt:CGRectMake(0,0,320,420)];

【问题讨论】:

【参考方案1】:

您的代码是正确的。很可能您的pageControl 的框架非常小,因此没有太多区域可以查找触摸事件。您需要增加pageControl高度 的大小,以确保始终能够识别点击。

【讨论】:

我已经读到了,但你不觉得我的身高不够吗?为了更好地理解,我在第一篇文章的末尾添加了创建代码。 该代码没有说明pageControl,除非您在哪里创建它。您可以确定的另一件事是它是最前面的控件。 我做了一些测试,这是一件非常奇怪的事情:当我向 pageControl 添加背景颜色时,它可以工作。 [UIColor clearColor] 不起作用。目前根本没有设置背景,主视图也没有。呃?

以上是关于UIPageControl 无法正确响应点击的主要内容,如果未能解决你的问题,请参考以下文章

UIPageControl 显示不正确的页面

UIPageControl + UIScrollView 没有正确计算页面

UIPageViewController setViewControllers,UIPageControl 未显示正确的当前编号

如何在 iPad 中正确设置 UIPageControl 大小

在 UIPageControl 旁边的 UILabel 上点击手势不起作用

Xamarin iOS - UIPageControl - 禁用左/右点击以递减/递增