跟随 UICollectionView 指示器的 UIView
Posted
技术标签:
【中文标题】跟随 UICollectionView 指示器的 UIView【英文标题】:UIView that follows UICollectionView indicator 【发布时间】:2015-09-08 14:52:26 【问题描述】:我想创建一个自定义 UIView,其中包含一个 UIImageView 和一个 UILabel,它指向 UICollectionView 滚动指示器,并随之滚动。
我正在使用此代码:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//get refrence of vertical indicator
UIImageView *verticalIndicator = ((UIImageView *)[scrollView.subviews objectAtIndex:(scrollView.subviews.count-1)]);
// get the relative position of the indicator in the main window
CGPoint p = [verticalIndicator convertPoint:verticalIndicator.bounds.origin toView:[[UIApplication sharedApplication] keyWindow]];
// set the custom view new position
CGRect indicatorFrame = self.indicatorView.frame;
indicatorFrame.origin.y = p.y;
self.indicatorView.frame = indicatorFrame;
但是indicatorView并没有完全跟随指标!!
【问题讨论】:
你的意思是你想让一个uiview附加到滚动条上? 是的,我刚刚上传了一张图片,说明我需要什么。绿色视图应始终跟随滚动指示器 这真的是 uicollection 视图吗? 请检查我的回答@Rifinio 【参考方案1】:这对我有用:请查看随附的 gif。我添加了与滚动指示器平行的蓝色自定义 uiview。
我尝试了表格视图,但这也适用于集合视图。
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
dispatch_async(dispatch_get_main_queue(), ^
//get refrence of vertical indicator
UIImageView *verticalIndicator = ((UIImageView *)[scrollView.subviews objectAtIndex:(scrollView.subviews.count-1)]);
// get the relative position of the indicator in the main window
// CGPoint p = [verticalIndicator convertPoint:verticalIndicator.bounds.origin toView:[[UIApplication sharedApplication] keyWindow]];
CGPoint p = CGPointMake(verticalIndicator.frame.origin.x-10,
verticalIndicator.frame.origin.y - scrollView.contentOffset.y);
// set the custom view new position
CGRect indicatorFrame = CGRectMake(verticalIndicator.frame.origin.x, verticalIndicator.frame.origin.y, 10, 10);
self.indicatorView.frame = indicatorFrame;
);
还请确保您在视图中添加了 uiview 确实加载方法。
//在viewDidLoad
:
请注意,我使用了 indicatorView 位置的示例值。您可以根据需要替换这些值。
indicatorView=[[UIView alloc]initWithFrame:CGRectMake( p.x, p.y , 10, 10)];
indicatorView.backgroundColor=[UIColor blueColor];
[self.tableView addSubview:indicatorView];
【讨论】:
可以改变p点x坐标。我已经给出了指标 10。 对我来说很好用,谢谢。您需要编辑答案并使用计算的 p 点:CGRect indicatorFrame = CGRectMake( p.x, p.y , 10, 10);【参考方案2】:对我来说这是可行的:
....
scrollIndicatorView = [self scrollIndicator];
[self.collectionView addSubview:scrollIndicatorView];
....
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
// percentage of the content reached * height
CGFloat yPos = (self.collectionView.contentOffset.y / (self.collectionView.contentSize.height - self.collectionView.bounds.size.height)) * self.collectionView.bounds.size.height;
yPos += self.collectionView.contentOffset.y; // add content offset becasue view is inside colelctionview which content moves
CGRect indicatorFrame = CGRectMake(self.collectionView.bounds.size.width - 10,
yPos,
10,
30);
scrollIndicatorView.frame = indicatorFrame;
【讨论】:
以上是关于跟随 UICollectionView 指示器的 UIView的主要内容,如果未能解决你的问题,请参考以下文章
iOS 10 GM 嵌入 UITableView 和 UICollectionView contentSize 错误且滚动指示器不显示
UITableView 和 UICollectionView 预取矩形大小
Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标