Как упомянул Wubao, вы должны использовать UIScrollViewDelegate
. Но вы должны проверить, какой scrollView перетаскивает / активен в данный момент. Потому что иначе у вас будет проблема с тем, что вы получите делегированные обратные вызовы из обоих представлений прокрутки, и они передадут свои изменения друг другу одновременно, что приведет к бесконечному циклу / бесконечной прокрутке.
Подробно необходимо проверить: - (void)scrollViewDidScroll:(UIScrollView *)scrollView
Но вы должны помнить предыдущее смещение, чтобы вы знали об изменении значения.
(Или ваши виды имеют одинаковую высоту. Тогда вы можете просто использовать contentSize.height-offset
в качестве смещения для другого вида.
Я постараюсь записать это немного (не проверено):
@interface ViewController () <UITableViewDelegate,UIScrollViewDelegate>
// instances of your tableviews
@property (nonatomic, strong) UITableView *tableLeft;
@property (nonatomic, strong) UITableView *tableRight;
// track active table
@property (nonatomic, strong) UIScrollView* activeScrollView;
// helpers for contentoffset tracking
@property (nonatomic, assign) CGFloat lastOffsetLeft;
@property (nonatomic, assign) CGFloat lastOffsetRight;
@end
@implementation ViewController
- (void) viewDidLoad
{
[super viewDidLoad];
self.tableLeft.delegate = self;
self.tableRight.delegate = self;
}
– (void) scrollViewWillBeginDragging: (UIScrollView*) scrollView
{
self.activeScrollView = scrollView;
self.tableViewRight.userInterActionEnabled = (self.tableViewRight == scrollView);
self.tableViewLeft.userInterActionEnabled = (self.tableViewLeft == scrollView);
}
- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if(!decelerate) {
self.activeScrollView = nil;
self.tableViewRight.userInterActionEnabled = YES;
self.tableViewLeft.userInterActionEnabled = YES;
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
self.activeScrollView = nil;
self.tableViewRight.userInterActionEnabled = YES;
self.tableViewLeft.userInterActionEnabled = YES;
}
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
if(self.activeScrollView == self.tableViewLeft)
{
CGFloat changeLeft = self.tableViewLeft.contentOffset.y - self.lastOffsetLeft;
self.tableViewRight.contentOffset.y += changeLeft;
}
else if (self.activeScrollView == self.tableViewRight)
{
CGFloat changeRight = self.tableViewRight.contentOffset.y - self.lastOffsetRight;
self.tableViewLeft.contentOffset.y += changeRight;
}
self.lastOffsetLeft = self.tableViewLeft.contentOffset.y;
self.lastOffsetRight = self.tableViewRight.contentOffset.y;
}
@end
Вот и все. Он также блокирует неактивное представление прокрутки. Потому что прокрутка обоих приведет к уродливому поведению. Также contentOffset.y += changeLeft;
не будет работать, вероятно. Вы должны создать новый CGPoint / CGSize.