对于我的iPad应用程序,我有一个主ViewController,它包含两个UIScrollviews和一个UIPageControl。 问题是没有调用分页的代理。 这是布局:
选择下方thumbScrollView中的按钮需要更新mainScrollView中的图像(此方法)滑动thumbScrollView或在页面上选择一个点控件需要“页面”thumbScrollView以显示下一组上一组按钮。滑动不起作用,因为委托函数没有被调用。
我在VC
中声明了scrollviews和pagecontrol,如下所示@property (strong, nonatomic) IBOutlet UIScrollView *mainScrollView;
@property (strong, nonatomic) IBOutlet UIScrollView *thumbScrollView;
@property (strong, nonatomic) IBOutlet UIPageControl *pageControl;
ViewController实现UIScrollViewDelegate
@interface MyViewController : UIViewController<UIScrollViewDelegate>
我在VC的.m文件中实现了以下UIScrollViewDelegate委托函数。
- (void)scrollViewDidScroll:(UIScrollView *)sender;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
视图出现但是当我在按钮上滑动时,我看不到上面的委托函数被调用。
我还没有在StackOverflow中找到解决方案,尽管我已经考虑过其他相关帖子的其他方面的建议(例如,区分哪个scrollview已启动动作的逻辑等)
在此处添加详细代码(根据@HeWas的要求)
这是主视图控制器的头文件,用于控制两个scrollviews和pagecontrol(相关的EXCERPTS - 如果您需要更多,请告诉我)
// 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
这是主视图控制器的实现文件,它控制两个scrollviews和pagecontrol(相关的EXCERPTS - 告诉我如果您需要更多)
//
// 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;
}
答案 0 :(得分:1)
您将所有外观编码为100%(除了这个错误:@synthesize floorplanThumbScrollView;
,但这不是您的问题。)
我确信答案是您没有在IB中正确连接您的滚动视图 DELEGATES 。
这是线索:
“是的,我已经在Interface Builder中设置了所有这三个。所以mainScrollView,thumbScrollView和pageControl在IB中连接到VC的.h文件中的上述声明。”
ViewController和scrollView之间需要2个连接。
(1)ctrl-drag FROM viewController to scrollView,连接到IBOutlet属性 这就是你所做的。
(2)ctrl-drag FROM scrollView to viewController,连接到delegate
我认为你没有这样做过。
第2步的说明
UIScrollView有一个名为“delegate”的内置属性。 scrollView使用此属性向其委托发送消息。您可以在界面构建器中设置此委托(步骤2),也可以在代码中执行此委托。例如,在viewController中,您可以这样做:
[myScrollView setDelegate:self];
将viewController设置为myScrollView的委托。如果您通过在Interface Builder中链接来执行此操作,则不需要此代码(并且IB不会创建任何代码)。
这实际上做的是将scrollView的委托iVar设置为指向viewController的指针。使用这样的委托的好处是委托人(UIScrollView)不必知道委托人的任何事情(在这种情况下你的UIViewController)。只要我们遵守它的委托协议,这就允许我们重用UIScrollView。
每当scrollView需要通知它的委托时,它会在内部发送一条这样的消息..
[self.delegate scrollViewDidScroll:self];
(你没有看到它,它在scrollView的实现中)。
您设置为scrollView委托的对象需要实现scrollView的委托协议声明的所有必需方法,并且可以选择实现任何可选委托方法。 Here is the protocol
要确定需要哪些方法,请阅读UIScrollView class reference,其中告诉您:
UIScrollView类可以有一个必须采用UIScrollViewDelegate协议的委托。要使缩放和平移工作,代理人必须同时实施
viewForZoomingInScrollView:
和scrollViewDidEndZooming:withView:atScale:
;此外,最大(maximumZoomScale
)和最小(minimumZoomScale
)缩放比例必须不同。
协议中的其他所有内容都是可选的。
这个委托模式是您可以轻松实现自己的对象重用的模式,也是在Objective-C中的解耦对象之间传递消息的最常用方法之一。