2015-09-08 3 views
3

Я хочу создать пользовательский UIView, который содержит UIImageView и UILabel, который указывает на индикатор прокрутки UICollectionView и прокручивается вместе с ним.UIView, который следует индикатору UICollectionView

enter image description here

Я использую этот код:

- (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 не следует индикатор точно !!

+0

вы имеете в виду вы хотите иметь UIView, прикрепленный к полосе прокрутки? –

+0

Да, я просто загрузил фотографию, объясняющую, что мне нужно. зеленый вид должен всегда следовать индикатору прокрутки – Rifinio

+0

- это действительно изображение с рисунком? –

ответ

2

Это сработало для меня: посмотрите на прилагаемый gif. Я добавил пользовательский uiview с синим цветом, параллельным индикатору scrool.

Я попробовал для просмотра таблицы, но это также работает и для коллекции.

enter image description here

-(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 postion.You может заменить их в соответствии с вашими потребностями.

indicatorView=[[UIView alloc]initWithFrame:CGRectMake(p.x, p.y , 10, 10)]; 

indicatorView.backgroundColor=[UIColor blueColor]; 

[self.tableView addSubview:indicatorView]; 
+0

, вы можете изменить координату p-точки x. Я дал индикатор-10. –

+0

Он отлично работает для меня, спасибо. вам нужно отредактировать ответ и использовать рассчитанную точку p: Индикатор CGRectFrame = CGRectMake (p.x, p.y, 10, 10); – Rifinio

0

Для меня это работает:

.... 
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; 
} 
Смежные вопросы