私のiPadアプリには、2つのUIScrollviewと1つのUIPageControlを含むメインのViewControllerがあります。問題は、ページングのデリゲートが呼び出されないことです。レイアウトは次のとおりです。
下のthumbScrollViewでボタンを選択すると、mainScrollViewの画像が更新される必要があります(これは機能します)thumbScrollViewをスワイプするか、pageControlでドットを選択すると、thumbScrollViewを「ページング」して、次の前のボタンのセットを表示する必要があります。デリゲート関数が呼び出されないため、スワイプは機能しません。
VCで次のようにスクロールビューとページコントロールを宣言します
@property (strong, nonatomic) IBOutlet UIScrollView *mainScrollView;
@property (strong, nonatomic) IBOutlet UIScrollView *thumbScrollView;
@property (strong, nonatomic) IBOutlet UIPageControl *pageControl;
ViewControllerはUIScrollViewDelegateを実装します
@interface MyViewController : UIViewController<UIScrollViewDelegate>
そして、次のUIScrollViewDelegateデリゲート関数をVCの.mファイルに実装します。
- (void)scrollViewDidScroll:(UIScrollView *)sender;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
ビューは表示されますが、ボタンをスワイプすると、上記のデリゲート関数が呼び出されません。
StackOverflowでこれに対する解決策を見つけられませんでしたが、これの他の側面について他の関連する投稿からのアドバイスを考慮しました(たとえば、どのスクロールビューがアクションを開始したかを区別するロジックなど)
ここに詳細なコードを追加する(@HeWasからの要求に応じて)
これは、2つのスクロールビューとページコントロールを制御するメインビューコントローラーのヘッダーファイルです(関連する抜粋-さらに必要な場合は教えてください)
// ImageBrowseViewController.h
// (NOTE - In Interface Builder I have added a tag attribute of 0 to mainScrollView
// and 1 to thumbScrollView, to enable me to distinguish which scrollView the delegate
// needs to respond to)
#define TAG_MAIN_SCROLLVIEW 0
#define TAG_THUMB_SCROLLVIEW 1
@interface ImageBrowseViewController : UIViewController<UIScrollViewDelegate>
{
UIButton* currentlySelectedButton;
UIScrollView *mainScrollView;
UIScrollView *thumbScrollView;
UIPageControl* pageControl;
BOOL pageControlBeingUsed;
}
@property (strong, nonatomic) IBOutlet UIScrollView *mainScrollView;
// … connected as outlet in IB to mainScrollView
@property (strong, nonatomic) IBOutlet UIScrollView * thumbScrollView;
// … connected as outlet in IB to thumbScrollView
@property (strong, nonatomic) IBOutlet UIPageControl *pageControl;
// … connected as outlet in IB to pageControl
…
-(IBAction)changePage; //Touch up Inside IBAction connected to pageControl
…
@end
これは、2つのスクロールビューとページコントロールを制御するメインビューコントローラーの実装ファイルです(関連する抜粋-さらに必要な場合は教えてください)
//
// ImageBrowseViewController.m
//
…
@synthesize mainScrollView;
@synthesize thumbScrollView;
@synthesize pageControl;
// UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)sender {
if ( [sender tag] == TAG_THUMB_SCROLLVIEW ) {
// This is the thumbScrollview
// Update the page when more than 50% of the previous/next page is visible
CGFloat pageWidth = self.thumbScrollView.frame.size.width;
int page =
floor((self.thumbScrollView.contentOffset.x - pageWidth / 2) / pageWidth)
+ 1;
self.pageControl.currentPage = page;
}
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
pageControlBeingUsed = NO;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
pageControlBeingUsed = NO;
}
- (IBAction)changePage {
// Update the scroll view to the appropriate page
CGRect frame;
//frame.origin.x = self.scrollView.frame.size.width * self.pageControl.currentPage;
frame.origin.x = self.thumbScrollView.frame.size.width * self.pageControl.currentPage;
frame.origin.y = 0;
frame.size = self.thumbScrollView.frame.size;
[self.thumbScrollView scrollRectToVisible:frame animated:YES];
// Keep track of when scrolls happen in response to the page control
// value changing. If we don't do this, a noticeable "flashing" occurs
// as the the scroll delegate will temporarily switch back the page
// number.
pageControlBeingUsed = YES;
}