跟随 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的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionView 页脚中显示活动指示器

iOS 10 GM 嵌入 UITableView 和 UICollectionView contentSize 错误且滚动指示器不显示

UITableView 和 UICollectionView 预取矩形大小

Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标

Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标

Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标