1

TableView と、2 つのページ (どちらも画像を含む) を持つ ScrollView と 2 つの白い点を表示する pageControl を含む detailView を使用して iPhone アプリを作成しました。

それは完璧に機能しているようです。ビューは左にスクロールし、次のページを表示します (本来あるべきように) scrollView の下にある小さな白い点 (PageControl の点) を除きます。小さなドットを押すと、ページがスクロールし、2 番目のドットが強調表示されます (完璧です!)。しかし、最初のページを(親指で手動で)次のページにスライドさせても、白い点は変化しません。(2 番目のドットが強調表示されます)。

誰かが私を助けてくれることを願っています。私はコードを 10 回読み、見つけたすべてのサンプル コードを検索しました。

これが私のコードです:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController

<UIScrollViewDelegate>
    {

 NSString *selectedImage1;
 NSString *selectedImage2;
 NSNumber *selectedNpages;

 IBOutlet UIScrollView* scrollView;
 IBOutlet UIPageControl* pageControl;

 BOOL pageControlIsChangingPage;
    }

@property (nonatomic, retain) NSString *selectedImage1;    
@property (nonatomic, retain) NSString *selectedImage2;    
@property (nonatomic, retain) NSNumber *selectedNpages;    
@property (nonatomic, retain) UIView *scrollView;    
@property (nonatomic, retain) UIPageControl* pageControl;

-(IBAction)changePage:(id)sender;    
-(void)setupPage;

 @end



#import "DetailViewController.h"

@implementation DetailViewController


@synthesize selectedImage1;
@synthesize selectedImage2;
@synthesize selectedNpages;
@synthesize scrollView;
@synthesize pageControl;


#pragma mark -
#pragma mark UIView boilerplate
- (void)viewDidLoad 
{
 [self setupPage];
 [super viewDidLoad];
}


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

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



#pragma mark -
#pragma mark The Guts
- (void)setupPage
{

 scrollView.scrollsToTop = NO;
 scrollView.delegate = self; 
 scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
 scrollView.clipsToBounds = YES;
 scrollView.scrollEnabled = YES;
 scrollView.pagingEnabled = YES;
 scrollView.showsHorizontalScrollIndicator = NO;
 scrollView.showsVerticalScrollIndicator = NO;
 [scrollView setCanCancelContentTouches:NO];
 pageControl.currentPage = 0;

 NSString *image1a = selectedImage1;
 NSString *image2a = selectedImage2;

 CGFloat cx = 0;


 //FIRST PAGE

  // Image

 UIImage *bimage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle]  pathForResource:image1a ofType:@"jpg"]];
 UIImageView *bimageView = [[UIImageView alloc] initWithImage:bimage];

 CGRect brect = bimageView.frame;

 brect.size.height = bimage.size.height;
 brect.size.width = bimage.size.width;
 brect.origin.x = ((scrollView.frame.size.width - bimage.size.width) / 2) + cx;
 brect.origin.y = ((scrollView.frame.size.height - bimage.size.height) / 2);

 bimageView.frame = brect; 
 [scrollView addSubview:bimageView];

 [bimageView release];

 cx += scrollView.frame.size.width;


 //SECOND PAGE

 if([selectedNpages intValue] == 2)
 {

  //Image

  UIImage *bimage2 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle]    pathForResource:image2a ofType:@"jpg"]];
  UIImageView *bimage2View = [[UIImageView alloc] initWithImage:bimage2];

  UIImageView *bimageView2 = [[UIImageView alloc] initWithImage:bimage2];

  CGRect brect2 = bimageView2.frame;
  brect2.size.height = bimage2.size.height;
  brect2.size.width = bimage2.size.width;
  brect2.origin.x = ((scrollView.frame.size.width - bimage2.size.width) / 2) + cx;
  brect2.origin.y = ((scrollView.frame.size.height - bimage2.size.height) / 2);

  bimageView2.frame = brect2;

  [scrollView addSubview:bimageView2];
  [bimageView2 release];

  cx += scrollView.frame.size.width;

 }

 self.pageControl.numberOfPages = [selectedNpages intValue];

 [scrollView setContentSize:CGSizeMake(cx, [scrollView bounds].size.height)]; 

 [image1a release];
 [image2a release]; 
}

#pragma mark -
#pragma mark UIScrollViewDelegate stuff

- (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;
}

#pragma mark -
#pragma mark PageControl stuff
- (IBAction)changePage:(id)sender 
{
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * pageControl.currentPage;
    frame.origin.y = 0;

    [scrollView scrollRectToVisible:frame animated:YES]; 

    pageControlIsChangingPage = YES;
}


- (void)dealloc {
 [DetailViewController release];
 [selectedImage1 release];
 [selectedImage2 release];
 [selectedImage2 release];
 [selectedNpages release];
 [super dealloc];
}

@end

これを読んでいただきありがとうございます。

4

2 に答える 2

4

ScrollViewDidScroll:のように、小文字の「S」で始める必要がありscrollViewDidScroll:ます。についても同様scrollViewDidEndDecelerating:です。

まあ、Objective-C では、常に小文字でメソッドを開始する必要があります。大文字は、クラス名、定数、おそらくグローバル用に予約されています。メソッド - 決して!

于 2010-10-27T20:32:26.560 に答える
1

Michal の回答で解決しない場合は、次の方法を試してください。

IBOutletpageControlは Interface Builder でクラスに接続されていますか? 接続されていない場合、pageControl.currentPage = page;in- (void)scrollViewDidScroll:(UIScrollView *)_scrollViewは選択されたドットを変更しません。

于 2010-10-27T20:38:27.067 に答える