2012-10-04 103 views
0

我正在嘗試響應在UIScrollView中的視圖。我設法通過UIScrollView的子類化轉發到我的子視圖,但如果我按下視圖,然後滾動,然後放開,「touchesEnded」方法不會被調用,所以視圖保持突出顯示。iOS:UIScroll視圖 - 防止在視圖上滾動觸摸

我想糾正此問題。

我試圖當一個視圖被竊聽按照本指南,以防止滾動:

http://www.musicalgeometry.com/?p=1404

一步涉及的CGRect屬性設置爲您的視圖的框架。當我嘗試這樣做時,它說我的子視圖的框架是(0,0,0,0)。這是-viewDidLoad,所以視圖應該已經被加載了。

-viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [scrollView setScrollEnabled:YES]; 
    [scrollView setDelaysContentTouches:NO]; 

    //Here I attempt to get the frame of my subview, but it gives me 
    //(0,0,0,0) 
    scrollView.subViewRect=locPhoneView.frame; 

    locImageView.image=locImage; 
    locNameLabel.text=locName; 
    locAddressLabel.text=locAddress; 
    locPhoneLabel.text=locPhone; 
    monHoursLabel.text=[NSString stringWithFormat:@"Mon:  %@",[locHours objectAtIndex:0]]; 
    tueHoursLabel.text=[NSString stringWithFormat:@"Tue:  %@",[locHours objectAtIndex:1]]; 
    wedHoursLabel.text=[NSString stringWithFormat:@"Wed:  %@",[locHours objectAtIndex:2]]; 
    thuHoursLabel.text=[NSString stringWithFormat:@"Thu:  %@",[locHours objectAtIndex:3]]; 
    friHoursLabel.text=[NSString stringWithFormat:@"Fri:  %@",[locHours objectAtIndex:4]]; 
    satHoursLabel.text=[NSString stringWithFormat:@"Sat:  %@",[locHours objectAtIndex:5]]; 
    sunHoursLabel.text=[NSString stringWithFormat:@"Sun:  %@",[locHours objectAtIndex:6]]; 
    closedSundayLabel.text=[locHours objectAtIndex:7]; 
} 

這裏是我的 「摩的」 的方法。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.view==locPhoneView){ 
     locPhoneView.backgroundColor=[ColorUtility colorWithHexString:@"83d3f0"]; 
    } 
    if(touch.view==locAddressView){ 
     locAddressView.backgroundColor=[ColorUtility colorWithHexString:@"83d3f0"]; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.view==locPhoneView){ 
     locPhoneView.backgroundColor=[UIColor whiteColor]; 
    } 
    if(touch.view==locAddressView){ 
     locAddressView.backgroundColor=[UIColor whiteColor]; 
    } 

} 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ 

} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

} 

所以我想我在尋找兩個可能的答案:

  1. 我怎麼locPhoneView.frame給我正確的尺寸?

  2. 失敗的是,有沒有辦法確保「touchesEnded」方法被調用,即使在觸摸的開始和結束之間有滾動?

回答

0

我不知道什麼是你的問題正是,但看起來像滾動型的代表像scrollViewDidScroll:或scrollViewDidEndDragging:或scrollViewDidEndDecelerating:可以幫助你。請參閱Responding to Scrolling and Dragging

基本上要處理滾動視圖內的觸摸,你需要將觸摸重定向到下一個響應者,這是你的視圖控制器。

+0

是的,我成功地指導下一響應者。但是,如果您觸摸視圖,然後滾動然後釋放,則其行爲不正確。在這種情況下不會調用「touchesEnded」。我試圖找到解決這個問題的方法。我在上面的鏈接中找到了一個建議的解決方案,但我沒有得到locPhoneView.frame的正確值。 –

+0

正是在這種情況下,您需要使用scrollViewdidScroll或scrollview委託方法之一。當你觸摸視圖時,將標誌設置爲isTouchBegun,並且如果你在scrollview委託方法中看到這個標誌,那麼你必須得到endingTouch事件,這意味着你觸及視圖然後滾動!希望這是有道理的。 – applefreak

+0

工程很棒。謝謝! –

相關問題