我有一个UIScrollView,其中包含用户可以滚动浏览的图像库。此视图需要在位于UITabBarController中的三个单独的UIViewController中的每一个上可见。现在,我在UITabBarController子类中有三个单独的UIScrollView实例,并且控制器管理保持三个同步(当用户滚动他们可以看到的那个,以编程方式滚动其他两个以匹配等),这是不理想的。
我想知道是否有一种方法只能使用UIScrollView的一个实例,但它只显示在用户当前正在与之交互的UIViewController中。这将完全消除所有同步代码。这基本上就是我现在在UITabBarController中所拥有的(这是目前管理的所有内容):
@interface ScrollerTabBarController : UITabBarController {
FirstViewController *firstView;
SecondViewController *secondView;
ThirdViewController *thirdView;
UIScrollView *scrollerOne;
UIScrollView *scrollerTwo;
UIScrollView *scrollerThree;
}
@property (nonatomic,retain) IBOutlet FirstViewController *firstView;
@property (nonatomic,retain) IBOutlet SecondViewController *secondView;
@property (nonatomic,retain) IBOutlet ThirdViewController *thirdView;
@property (nonatomic,retain) IBOutlet UIScrollView *scrollerOne;
@property (nonatomic,retain) IBOutlet UIScrollView *scrollerTwo;
@property (nonatomic,retain) IBOutlet UIScrollView *scrollerThree;
@end
@implementation ScrollerTabBarController
- (void)layoutScroller:(UIScrollView *)scroller {}
- (void)scrollToMatch:(UIScrollView *)scroller {}
- (void)viewDidLoad {
[self layoutScroller:scrollerOne];
[self layoutScroller:scrollerTwo];
[self layoutScroller:scrollerThree];
[scrollerOne setDelegate:self];
[scrollerTwo setDelegate:self];
[scrollerThree setDelegate:self];
[firstView setGallery:scrollerOne];
[secondView setGallery:scrollerTwo];
[thirdView setGallery:scrollerThree];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[self scrollToMatch:scrollView];
}
@end
当用户滚动其中一个实例时,会通知UITabBarController(作为滚动视图的委托),然后调用scrollToMatch:
之类的方法以用户的选择同步其他两个。
有没有什么可以做的,使用IBOutlet上的多对一关系或类似的东西,将其缩小到一个实例,这样我就不必管理三个滚动视图了?我尝试保留一个实例并使用UITabBarControllerDelegate方法将指针从一个视图移动到下一个视图(每次更改时调用当前setGallery:nil
和下一个setGallery:scrollerOne
),但滚动条从未移动过到其他标签。
提前致谢!
答案 0 :(得分:1)
当然,您应该只使用滚动条视图的一个实例。它会正常工作没有任何麻烦。使用方法setGallery:就像你一样,只需确保在setGallery方法中添加singleScrollerForAll视图以查看当前控制器:
-(void)setGallery:(UIView *)aScrollerView{
[self.view addSubview:aScrollerView];
}
并致电:
[firstView setGallery:singleScrollerForAll];
或
[secondView setGallery:singleScrollerForAll];
并且无需在其他两个控制器中执行任何操作,因为当您调用addSubview时:subView将自动从之前的superview中删除。