Jac*_*nce 3 objective-c uitableview uikit ios
我有一个项目,我需要UITableView
在iPad上的同一视图中显示多个实例.它们也恰好是旋转的,但我相当肯定这是无关紧要的.用户应该不知道视图由多个表视图组成.因此,我想这样做,当我滚动一个tableview时,其他人同时滚动它.
因为UITableView
是它的子类UIScrollView
,我想我可以处理UIScrollViewDelegate
方法并将它们传递给所有的tableview.不幸的是,虽然我可以捕获一些事件,但是方法调用粒度不够好,而且我在将这些消息传递给其他tableviews时遇到了麻烦.我能得到的最接近的是实现-scrollViewDidScroll:
然后调用-setContentOffset:animated
每个tableview.如果我尝试为所有可能的情况发送此消息,我最终会锁定,因为-scrollViewDidScroll
我的-setContentOffset:animated
呼叫被调用,所以我最终冻结了.无论如何,如果我通过仅使用此方法检测一个tableview上的滚动然后将其传递给其他tableviews来消除锁定,我发现虽然其他tableviews最终滚动到同一位置,但它们落后于第二个或二.
如何在不进行子类化的情况下实现此行为UITableView
?
war*_*enm 11
您可以通过contentOffset
直接观察来解决回调粒度问题.在viewDidLoad
,您需要同步的每个表视图上设置KVO:
for(UITableView *view in self.tableViewCollection)
{
[view addObserver:self
forKeyPath:@"contentOffset"
options:NSKeyValueObservingOptionNew
context:NULL];
}
Run Code Online (Sandbox Code Playgroud)
然后,当您观察到更改时,暂时取消观察,更新其他表视图的偏移,然后重新开启观察.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
static BOOL isObservingContentOffsetChange = NO;
if([object isKindOfClass:[UITableView class]]
&& [keyPath isEqualToString:@"contentOffset"])
{
if(isObservingContentOffsetChange) return;
isObservingContentOffsetChange = YES;
for(UITableView *view in self.tableViewCollection)
{
if(view != object)
{
CGPoint offset =
[[change valueForKey:NSKeyValueChangeNewKey] CGPointValue];
view.contentOffset = offset;
}
}
isObservingContentOffsetChange = NO;
return;
}
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
Run Code Online (Sandbox Code Playgroud)
这可能会变得更漂亮,但它可以解决这个问题.
contentOffset
直接使用该属性而不是setContentOffset:animated
避免滞后.在您的示例中,将第73行和第74行更改为
self.tableViewMiddle.contentOffset = scrollView.contentOffset;
self.tableViewBottom.contentOffset = scrollView.contentOffset;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5315 次 |
最近记录: |