【问题标题】:Page Control not changing when scroll view scrolls滚动视图滚动时页面控制不改变
【发布时间】:2011-11-21 09:59:00
【问题描述】:

我正在尝试将页面控件添加到我的滚动视图中,并且遵循了许多网络教程,其中大多数使用与 tutorial. 相同的代码但是,一旦我将代码放入我的项目中,即使我正在制作更改代码以尝试使其正常工作,但事实并非如此。我已经设法使代码在按下页面控件时工作,但是它不适用于页面滚动。我的问题类似于this,尽管答案没有帮助。这是我的代码:

MainViewController.h

@interface MainViewController : UIViewController
{
UIScrollView *svCollegeMain;
UIScrollView *svCollegePage;
UIPageControl *pcCollege;
UIView *viewP1;
}

@property (nonatomic, retain) IBOutlet UIScrollView* svCollegeMain;
@property (nonatomic, retain) IBOutlet UIScrollView* svCollegePage;
@property (nonatomic, retain) IBOutlet UIPageControl * pcCollege;
- (IBAction)changePage;

@end

和 MainViewController.m

@implementation MainViewController

@synthesize svCollegeMain, svCollegePage, pcCollege;

- (void)viewDidLoad 
{
[super viewDidLoad];
self.svCollegeMain.contentSize = CGSizeMake(960, 332);
self.svCollegePage.contentSize = CGSizeMake(320, 500);
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)scrollViewDidScroll:(UIScrollView *)sender
{
CGFloat pageWidth = 320;
int page = floor((svCollegeMain.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pcCollege.currentPage = page;
}

- (IBAction)changePage 
{
CGRect frame;
frame.origin.x = self.svCollegeMain.frame.size.width * self.pcCollege.currentPage;
frame.origin.y = 0;
frame.size = self.svCollegeMain.frame.size;
[self.svCollegeMain scrollRectToVisible:frame animated:YES];
}

#pragma mark - View lifecycle

- (void)viewDidUnload
{
[super viewDidUnload];
self.svCollegeMain = nil;
self.svCollegePage = nil;
self.pcCollege = nil;
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

以防万一这有什么不同,我的视图设置有一个视图,然后是该视图中的主滚动视图和页面控件,主滚动视图中的另一个视图和滚动视图(彼此相邻),最后第二个滚动视图中的最终视图(全部在 IB 中,不需要太多代码),所有内容都在 IB 中链接。

【问题讨论】:

    标签: ios xcode uiscrollview uipagecontrol


    【解决方案1】:

    我注意到您的 MainViewController 没有声明自己实现 UIScrollViewDelegate,所以我还假设您忘记将其设置为 IB 中滚动视图的委托(否则无法编译)。

    因为它没有定义委托,所以滚动视图不会调用你的 scrollViewDidScroll 函数。

    提姆

    【讨论】:

    • 非常感谢!每次我检查代码时,那条线都会从我身边飞过。那一行和下面一行就完成了: svCollegeMain.delegate = self; (.m) 和 .h 中的 。谢谢
    【解决方案2】:

    试试这个

    头文件:

    @interface DemoPageControlViewController : UIViewController <UIScrollViewDelegate>
    {
    IBOutlet UIScrollView *scrollView;
    IBOutlet UIPageControl *pageControl;
    BOOL pageControlUsed;
    NSMutableArray *imageArray;
    int  pageNumber;
    
    
    }
    
    
    @property (nonatomic, retain) UIScrollView *scrollView;
    @property (nonatomic, retain) UIPageControl *pageControl;
    @property (nonatomic, retain) NSMutableArray *imageArray;
    
    
    - (IBAction) changePage:(id)sender;
    

    实施文件:

    #import "DemoPageControlViewController.h"
    
    @implementation DemoPageControlViewController
    @synthesize pageControl, scrollView, imageArray;
    - (void)viewDidLoad 
    {
    [super viewDidLoad];
    
    CGRect frame;
    frame.origin.x = 0;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
    
    imageArray = [[NSMutableArray alloc]init];
    [imageArray addObject:@"small_one.png"];
    [imageArray addObject:@"small_two.png"];
    [imageArray addObject:@"small_three.png"];
    [imageArray addObject:@"small_four.png"];
    
    
    // add the last image to first
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:       [imageArray objectAtIndex:([imageArray count] -1)]]];
    imageView.frame = CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height);
    [self.scrollView addSubview:imageView];
    [imageView release]; 
    
    for(int i = 0; i < imageArray.count; i++)
    {
        UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[imageArray objectAtIndex:i]]];
        imageView.frame = CGRectMake((scrollView.frame.size.width * i ) + 320   , 0, scrollView.frame.size.width, scrollView.frame.size.height);
        [self.scrollView addSubview:imageView];
        [imageView release];
    }
    // add the first image to last
    imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[imageArray objectAtIndex:0]]];
    imageView.frame = CGRectMake(scrollView.frame.size.width * ([imageArray count]+1), 0, scrollView.frame.size.width, scrollView.frame.size.height);
    [self.scrollView addSubview:imageView];
    [imageView release]; 
    
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * ([imageArray count]+ 2), self.scrollView.frame.size.height);
    [scrollView setContentOffset:CGPointMake(0, 0)];
    [self.view addSubview:scrollView];
    [self.scrollView scrollRectToVisible:CGRectMake(scrollView.frame.size.width,0,scrollView.frame.size.width,scrollView.frame.size.height) animated:NO]; 
    }
    
    - (IBAction)changePage :(id)sender
    {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * self.pageControl.currentPage ;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
    [self.scrollView scrollRectToVisible:frame animated:YES];
    }
    
    
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
    pageControlUsed = NO;             
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {
    //pageControlUsed = NO;
    
    NSLog(@"%f", self.scrollView.contentOffset.x);
    
    CGFloat pageWidth = self.scrollView.frame.size.width;
    //pageNumber = floor((self.scrollView.contentOffset.x - pageWidth / ([imageArray count]+2)) / pageWidth) + 1  ;
    pageNumber = self.scrollView.contentOffset.x / pageWidth;
    
    if(pageNumber ==  0)
    {
        [self.scrollView scrollRectToVisible:CGRectMake((self.scrollView.frame.size.width * [imageArray count]), 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height) animated:NO];
        pageNumber = [imageArray count];
        //self.pageControl.currentPage = pageNumber;
    }
    else if(pageNumber == ([imageArray count]+1))
    {
        [self.scrollView scrollRectToVisible:CGRectMake(self.scrollView.frame.size.width, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height) animated:NO];
        pageNumber = 1;
        //self.pageControl.currentPage = pageNumber;
    }
    
    self.pageControl.currentPage = pageNumber - 1;
    
      }
    
     - (void)scrollViewDidScroll:(UIScrollView *)scrollView
      {
    
      }
    

    此代码运行良好。试试这个

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多