2011-10-06 86 views
0

如果我有一個UIView作爲UIScrollView的子視圖,並且這個滾動視圖是一個水平滾動視圖,我怎麼知道UIView(子視圖)何時不在UIScrollView中,以便我可以刪除它作爲子視圖並將其存儲在其他地方以供重用?有這樣的代表嗎?UISiew裏面的UIScrollView問題

+1

什麼是總體使用情況?通常你會把UIView放在那裏,以便當他們回滾時。 –

+0

用例是我想擁有一個UIView池,因爲在屏幕上每次只有3個子視圖。當他們回滾時,我想從我的池中重用UIView。有點像UITableView單元,你可以重用 – xonegirlz

回答

0

是的,這是一個委託,你需要使用UIScrollViewDelegate。

http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UIScrollViewDelegate_Protocol/Reference/UIScrollViewDelegate.html

的方法scrollViewDidScroll告訴你,當滾動追加,所以在這個功能,你可以測試contentOffset財產(scrollview.contentOffset.x),然後將它與您的視圖的位置和大小比較(myView.frame.origin.x + myView.frame.size.width)。

所以basicaly你應該做的

if(scrollview.contentOffset.x > (myView.frame.origin.x + myView.frame.size.width)) 
//Remove my view to reuse it 

如果你只有2次顯示,只是想重新使用每個視圖中,你可以找到當前顯示的是這樣的觀點:

//Assuming your views had the same width and it is store in the pageWidth variable 
    float currPosition = photoGalleryScrollView.contentOffset.x; 
    //We look for the selected page by comparing his width with the current scroll view position 
    int selectedPage = roundf(currPosition/pageWidth); 
    float truePosition = selectedPage * pageWidth; 
    int zone = selectedPage % 2; 
    BOOL view1Active = zone == 0; 
    UIView *nextView = view1Active ? view2 : view1; 
    UIView *currentView = view1Active ? view1 : view2; 

    //We search after the next page 
    int nextpage = truePosition > currPos + 1 ? selectedPage-1 : selectedPage+1; 

    //then we compare our next page with the selectd page 
    if(nextpage > selectedPage){ 
     //show next view 
    } 
    else{ 
     //show previous view 
    } 

之後,您需要向nextView添加一些內容,將其添加到滾動視圖並在隱藏時刪除currentView。

+0

如果我想知道這個視圖是否因爲用戶水平向左或向右水平滑動而消失了,該怎麼辦? – xonegirlz

0

您可以使用UIScrollViewDelegate方法scrollViewDidEndDecelerating:和一些自定義代碼來實現此目的。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //set theScrollView's delegate 
    theScrollView.delegate = self; 
} 

//custom method for determining visible rect of scrollView 
- (CGRect)visibleRectForScrollView:(UIScrollView *)scrollView; { 
    CGFloat scale = (CGFloat) 1.0/scrollView.zoomScale; 
    CGRect visibleRect; 
    visibleRect.origin = scrollView.contentOffset; 
    visibleRect.size = scrollView.bounds.size; 
    float theScale = 1.0/scale; 
    visibleRect.origin.x *= theScale; 
    visibleRect.origin.y *= theScale; 
    visibleRect.size.width *= theScale; 
    visibleRect.size.height *= theScale; 
    return visibleRect; 
} 

//UIScrollView Delegate method 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    BOOL viewVisisble = CGRectContainsRect([self visisbleRectForScrollView:theScrollView], theView.frame); 
    if(!viewVisisble) { 
     //do something 
    } 
} 
+0

visibleRect是一個CGRect,但你正在返回一個CGFloat? – xonegirlz

+0

顯然這是一個錯誤,你可以看到它說CGRect在代碼中的方法 –