2010-06-01 42 views
21

我有UIScrollView与多个UIVIew子视图。我想更新每个UIView显示在UIScrollView可见部分的数据。viewWillAppear的子视图

什么是被触发的回调?我试图viewWillAppear,但它似乎并没有被调用。

谢谢。 :)

回答

83

你必须自己做计算。在滚动视图的委托实施scrollViewDidScroll:和手动计算,其观点是可见的(例如,通过检查,如果CGRectIntersectsRect(scrollView.bounds, subview.frame)返回true

+0

好了,由于某种原因,我的印象是,有一个内置的回调。谢谢。 – nan 2010-06-01 16:08:26

+0

工程就像一个魅力,谢谢! – jhilgert00 2012-02-22 06:45:54

+0

从我可以收集的viewWillAppear:和它的亲属只被称为第一次视图添加到视图层次结构。即使superview的viewWillAppear:被调用,那些已经在其层次结构中的子视图也不会。因此,对于这种简单的情况,您需要告诉您的子视图从哪个根视图获取该消息进行刷新。 – 2012-10-07 23:45:43

3

轻微的改进,我想知道这是显示在滚动视图的视图的数量:。

- (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

以上的答案是正确的,如果你的滚动视图是不是在状态的放大。在情况下,如果你需要考虑变焦太

这里是代码

您的滚动视图可以放大上述计算将无法正常工作
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 2016-03-31 02:45:28

5

斯威夫特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") 
    } 
}