2010-06-01 2 views
21

У меня есть UIScrollView с несколькими подвидными UIVIew. Я хотел бы обновить данные, отображаемые каждым UIView, когда они появляются в видимой части UIScrollView.viewWillAppear для подзаголовков

Каков ответ, который срабатывает? Я попробовал viewWillAppear, но он, похоже, не вызван.

Спасибо. :)

ответ

83

Вам нужно сделать расчет самостоятельно. Реализовать scrollViewDidScroll: на ваш взгляд прокрутки делегатом и рассчитать вручную, что взгляды видны (например, путем проверки, если CGRectIntersectsRect(scrollView.bounds, subview.frame) возвращает истинное

+0

Хорошо, по какой-то причине я был под впечатлением, что был построен в функции обратного вызова. Благодарю. – nan

+0

Работает как шарм, спасибо! – jhilgert00

+0

Из того, что я могу собрать viewWillAppear: его родственники вызываются только при первом добавлении представления в иерархию представлений. Даже если вызов viewviewWillAppear: вызывает вызов, те из любых подзадач, которые уже находятся в его иерархии, не будут. Поэтому в этом простом случае вам нужно сообщить, что ваши подпрограммы обновлены, независимо от того, какое корневое представление получает это сообщение. –

3

небольшое уточнение Я хотел бы знать количество мнение, что отображалось в Scrollview:..

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
{ 
    // Figure out how much of the self.userFeedbackView is displayed. 
    CGRect frame = CGRectIntersection(self.scrollView.bounds, self.userFeedbackView.frame); 
    CGFloat proportion = (frame.size.height*frame.size.width)/(self.userFeedbackView.frameWidth*self.userFeedbackView.frameHeight); 
    NSLog(@"%f; %@", proportion, NSStringFromCGRect(frame)); 
} 
5

выше правильные ответы, если ваш Scrollview не в увеличенном в состоянии. в случае, если ваш Scrollview может увеличить выше расчет не будет работать, как вам нужно рассмотреть увеличение слишком

здесь код

CGRect visibleRect; 
       visibleRect.origin = self.mapScrollView.contentOffset; 
       visibleRect.size = self.mapScrollView.bounds.size; 

       float theScale = 1.0/self.mapScrollView.zoomScale; 
       visibleRect.origin.x *= theScale; 
       visibleRect.origin.y *= theScale; 
       visibleRect.size.width *= theScale; 
       visibleRect.size.height *= theScale; 
       if(CGRectIntersectsRect(visibleRect, btnPin.frame)){ 
         ... 
       } 
+0

Это замечательно! Не понял бы этого – csduarte

5

Swift 3 раствор

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let viewFrame = greenView.frame 

    let container = CGRect(x: scrollView.contentOffset.x, y: scrollView.contentOffset.y, width: scrollView.frame.size.width, height: scrollView.frame.size.height) 


    // We may have received messages while this tableview is offscreen 
    if (viewFrame.intersects(container)) { 
     // Do work here 
     print("view is visible") 
    } 
    else{ 
     print("nope view is not on the screen") 
    } 
} 
Смежные вопросы