Для моего приложения для iPad у меня есть основной ViewController, который содержит два UIScrollview и UIPageControl. Проблема в том, что делегаты для пейджинга не вызываются. Вот макет:
При выборе кнопки в нижнем thumbScrollView необходимо обновить изображение в mainScrollView (это работает). Пролистывание thumbScrollView или выбор точки на странице. Control должен «пролистывать» 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 в файле .m моего VC.
- (void)scrollViewDidScroll:(UIScrollView *)sender;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
Представление появляется, но когда я прокручиваю кнопки, я не вижу вызываемых выше функций делегата.
Я не нашел решения для этого в StackOverflow, хотя я учел рекомендации из других связанных сообщений для других аспектов этого (например, логика, позволяющая различать, какой вид прокрутки инициировал действие и т. д.)
ДОБАВЛЕНИЕ ПОДРОБНОГО КОДА ЗДЕСЬ (по просьбе @HeWas)
Это заголовочный файл для контроллера основного представления, который управляет двумя видами прокрутки и управлением страницами (СООТВЕТСТВУЮЩИЕ ВЫДЕРЖКИ - СКАЖИТЕ МНЕ, ЕСЛИ ВАМ НУЖНО БОЛЬШЕ)
// 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
Это файл реализации для контроллера основного представления, который управляет двумя видами прокрутки и управлением страницами (СООТВЕТСТВУЮЩИЕ ВЫДЕРЖКИ - СКАЖИТЕ МНЕ, ЕСЛИ ВАМ НУЖНО БОЛЬШЕ)
//
// 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;
}