【问题标题】:UIPageControl -- View's not changing on click of dotsUIPageControl - 单击点时视图不会改变
【发布时间】:2011-08-24 01:16:27
【问题描述】:

我在我的应用程序中使用 pageControl。当我单击视图时,视图不会在单击点时发生变化,而是在 pageControl 的两端发生变化。我希望他们在点击点时改变。该怎么办?有什么我需要实施的方法吗?

这是代码

#import "ScrollingViewController.h"

@implementation ScrollingViewController
@synthesize scrollView;
@synthesize pageControl;

- (void)viewDidLoad 
{
    [super viewDidLoad];
    [self setupPage];
    pageControl =[[UIPageControl alloc] initWithFrame:CGRectMake(0,390,320,100)]; 
    pageControl.userInteractionEnabled =YES;
    pageControl.numberOfPages = 5; 
    pageControl.currentPage = 0;
    [self.pageControl setBackgroundColor:[UIColor blackColor]];
    pageControl.enabled = TRUE;
    [pageControl setHighlighted:YES];
    [pageControl addTarget:self action:@selector(changePage:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:pageControl]; 
}


- (void)didReceiveMemoryWarning 
{
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload 
{
    [scrollView release];
    [pageControl release];
}


- (void)dealloc 
{
    [super dealloc];
}


- (void)setupPage
{
    scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,400)];
    [scrollView setContentSize:CGSizeMake(1000, 800)];
    //scrollView.contentSize = CGSizeMake(1000,800);
    scrollView.scrollsToTop = NO;
    [self.scrollView setBackgroundColor:[UIColor blackColor]];
    [scrollView setCanCancelContentTouches:NO];
    scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    scrollView.clipsToBounds = YES;
    scrollView.scrollEnabled = YES;
    scrollView.pagingEnabled = YES;

    NSUInteger nimages = 0;
    CGFloat cx = 0;
    for (; ; nimages++) 
    {
        NSString *imageName = [NSString stringWithFormat:@"image%d.jpg", (nimages + 1)];
        UIImage *image = [UIImage imageNamed:imageName];
        if (image == nil) 
        {
            break;
        }
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

        CGRect rect = imageView.frame;
        rect.size.height = image.size.height;
        rect.size.width = image.size.width;
        rect.origin.x = ((scrollView.frame.size.width - image.size.width) / 2) + cx;
        rect.origin.y = ((scrollView.frame.size.height - image.size.height) / 2);

        imageView.frame = rect;

        [scrollView addSubview:imageView];
        [imageView release];

        cx += scrollView.frame.size.width;
    }

    self.pageControl.numberOfPages = nimages;
    [scrollView setContentSize:CGSizeMake(cx, [scrollView bounds].size.height)];
    scrollView.delegate = self;
    [self.view addSubview:scrollView];
}


- (void)scrollViewDidScroll:(UIScrollView *)_scrollView
{
    if (pageControlIsChangingPage) 
    {
        return;
    }


    CGFloat pageWidth = _scrollView.frame.size.width;
    int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    pageControl.currentPage = page;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 
{
    pageControlIsChangingPage = NO;
}



- (IBAction)changePage:(id)sender 
{
    /*
     *  Change the scroll view
     */
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * pageControl.currentPage;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:YES];
    pageControlIsChangingPage = YES;
}

@end

【问题讨论】:

  • 请给我们一些代码

标签: iphone cocoa-touch ios uiscrollview


【解决方案1】:

尽可能增加页面控件的宽度。即使您将页面控件的宽度保持得足够短,使其无法容纳的点数,它也可以显示它们。但无法接收到动作。

【讨论】:

  • pageControl 的宽度足够大。虽然它不起作用?
  • 如果您在 xib 中有显示 2 个点的页面控件宽度,并且如果在程序中将其 numberOfPages 设置为 10,则会出现此问题。应用程序中显示 x 个点的页面控件的宽度应与显示 x 个点的 xib 文件中的页面控件的宽度相同。
  • 我改变了宽度但没有用。我已经在上面显示了我的代码,你能帮我吗?
  • 我只用页面控制尝试了你的代码。我将页数设置为 7。当我点击点 2 和 3 时,它没有响应。我点击了点 4,它响应并继续点击它,直到我到达最后一个点,即 7。现在,当我点击点 2 和 3 时,它会响应!相反的情况也是如此。它表明点 2 和 3 实际响应。但在某些情况下他们不会。在我看来,苹果好像为我们提供了这个。
【解决方案2】:

在 ScrollView.m 中使用

#pragma mark -
#pragma mark loadGalleryView

-(void) loadGalleryView{
    galleryArr = [memberDic objectForKey:@"arrKey"];

    if ([galleryArr count]%5 != 0) 
    {
        noOfPages = ([galleryArr count]/5)+1;
    }
    else 
    {
        noOfPages = [galleryArr count]/5;
    }


    viewControllers = [[NSMutableArray alloc] init];
    for (int i=0; i<noOfPages; i++) 
    {
        [viewControllers addObject:[NSNull null]];
    }

    [galleryScrollView setPagingEnabled:TRUE];

    [galleryScrollView setContentSize:CGSizeMake(self.view.frame.size.width* noOfPages,69.0f)];
    [galleryScrollView setShowsHorizontalScrollIndicator:FALSE];
    [galleryScrollView setShowsVerticalScrollIndicator:FALSE];
    [galleryScrollView setScrollsToTop:FALSE];
    [galleryScrollView setDelegate:self];

    [pageControl setNumberOfPages:noOfPages];
    [pageControl setCurrentPage:0];

    [self loadScrollViewWithPage:0];
    [self loadScrollViewWithPage:1];
}

//-----------------Load scroll View----------------------------------

-(void) loadScrollViewWithPage:(int) page{
    if (page < 0) 
    {
        return;
    }

    if (page >= noOfPages) 
    {
        return;
    }

    GalleryViewController *givc = [viewControllers objectAtIndex:page];
    if ((NSNull *)givc == [NSNull null]) 
    {
        givc = [[GalleryViewController alloc] initWithPageNumber:page];
        givc.imageArr = [galleryArr retain];
        [viewControllers replaceObjectAtIndex:page withObject:givc];
        [givc release];
    }

    if (nil == givc.view.superview) 
    {
        CGRect frame = self.view.frame;

        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0.0f;
        givc.view.frame = frame;
        [galleryScrollView addSubview:givc.view];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    // We don't want a "feedback loop" between the UIPageControl and the scroll delegate in
    // which a scroll event generated from the user hitting the page control triggers updates from
    // the delegate method. We use a boolean to disable the delegate logic when the page control is used.
    // Switch the indicator when more than 50% of the previous/next page is visible
    CGFloat pageWidth = galleryScrollView.frame.size.width;
    int page = floor((galleryScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    pageControl.currentPage = page;

    // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
    [self loadScrollViewWithPage:page - 1];
    [self loadScrollViewWithPage:page];
    [self loadScrollViewWithPage:page + 1];

    // A possible optimization would be to unload the views+controllers which are no longer visible
}

// At the end of scroll animation, reset the boolean used when scrolls originate from the UIPageControl

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    isPageControlUsed = NO;
}

在 GalleryView.m 中使用

- (void)viewDidLoad {
    [super viewDidLoad];

    float x = 7.0f;

    for (int i = (pageNumber*5); i<(pageNumber+1)*5; i++) 
    {
        if (i<[imageArr count]) 
        {
            NSString *url = [imageArr objectAtIndex:i];

            MyImageView *imgView = [[MyImageView alloc] initWithFrame:CGRectMake(x, 7.5f, 55.0f, 55.0f)];
            [imgView addImageFrom:url];
            [self.view addSubview:imgView];
            [imgView release];

            x = x+62.5f;
        }

    }

}

-(id)initWithPageNumber:(int) page{
    if (self = [super initWithNibName:@"GalleryViewController" bundle:nil]) 
    {
        pageNumber = page;
    }
    return self;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多