2015-06-17 102 views
1

我有一個UIScrollView(有清晰的背景),在它後面有一個UIImage,佔用了設備高度的1/3左右。爲了初始顯示坐在滾動視圖中的圖像,我將scrollviews contentInset設置爲使用與圖像相同的高度。這正是我想要的,初始化顯示圖像,但向下滾動最終將覆蓋滾動視圖內容的圖像。UIScrollView滾動到背景視圖

唯一的問題是我在圖像上添加了一個按鈕。但是它不能被觸及,因爲UIScrollView實際上已經超過了它的頂部(即使由於清晰的背景可以看到該按鈕)。我怎樣才能使這個工作。

enter image description here

enter image description here

編輯:

下解決了這個問題:

//viewdidload 
    self.scrollView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "onScrollViewTapped:")) 
    ... 
    func onScrollViewTapped(recognizer:UITapGestureRecognizer) 
     { 
      var point = recognizer.locationInView(self.view) 
      if CGRectContainsPoint(self.closeButton.frame, point) { 
        self.closeButton.sendActionsForControlEvents(UIControlEvents.TouchUpInside) 
      } 
     } 

回答

1

感謝您的截圖和參考谷歌地圖做你在找什麼,我現在可以看到你在說什麼了。

我注意到圖像是可點擊的並且滾動過來,但圖像本身沒有顯示按鈕。你可以做的就是在你的UIScrollView中放一個清晰的按鈕來覆蓋圖像,以便在看到圖像時使其可點擊。據我所知,你無法點擊UIScrollView下的任何東西。

請讓我知道,如果這對你有用。

+0

滾動視圖是在上面,以便示出所述圖像和按鈕,它後面的背景。當滾動它滾動這個圖像的頂部和按鈕隱藏它們。 –

+0

我加入2個截圖 –

+1

@Ben_hawk你不明白羅布答案。他說要將按鈕添加到您的「UIScrollView」內容而不是圖像。這樣可以觸摸按鈕。當您向上滾動時,按鈕將在視圖外滾動,所以一切都會好起來。 – pteofil

0

兩件事情來測試:

1)確保包含一個按鈕都有userInteractionEnabled設置爲true(默認爲false)的圖像。雖然,由於該按鈕是一個子視圖,並添加在ImageView(我假設)的頂部,那麼這可能沒有幫助。

2)如果這沒有幫助,你可以添加按鈕作爲UIScrollViewsubview,並將其位置設置爲圖像的位置?這樣,它應該保持在圖像上,並在用戶向下滾動時隱藏,但可點擊,因爲它是ScrollView的孩子。

一些代碼和/或圖像也會有所幫助。

+0

對於第2點,它不會產生所需的效果。背景圖像和按鈕應保持固定並在頂部滾動。在查看地點細節時,Google地圖應用中可以看到同樣的效果。地點圖像和後退按鈕固定在頂部,並且地點詳細信息在其頂部滾動 –

+0

我添加了2個屏幕截圖 –

0

我認爲做到這一點的方法是繼承你的UIScrollView中的任何對象,並覆蓋touches began/touches ended。然後找出哪些座標正在被觸摸以及它們是否落在您的按鈕的邊界內。在斯威夫特這將是:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) { 

     println("!!! touchesBegan") 

     if var touch = touches.first { 

      var touchObj:UITouch = touch as! UITouch 

      println("touchesBegan \(touchObj.locationInView(self))") //this locationInView should probably target the main screen view and then test coordinates against your button bounds 


     } 
     super.touchesBegan(touches, withEvent:event!) 
    } 

參見: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/index.html#//apple_ref/occ/instm/UIResponder/touchesBegan:withEvent

和: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITouch_Class/index.html#//apple_ref/occ/instm/UITouch/locationInView

+0

您可能還想與touchesEnded進行比較以查看擺動房間:) – dijipiji

0

你應該繼承UIScrollView和覆蓋-hitTest:withEvent:像這樣,以確保它只吃觸摸它應該。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *const inherited = [super hitTest:point withEvent:event]; 

    if (inherited == self) return nil; 

    return inherited; 
} 

同時一定要設置userInteractionEnabledYES在圖像視圖。

1

一個簡單的解決方案是脫節重新排序文檔中的視圖。在大綱視圖中的高,低的觀點是作爲一個層

enter image description here

+0

我不認爲這樣做會在這種情況下工作,因爲滾動視圖必須低於按鈕和圖像,以便它滾動到頂部。 –

0

有,你可以檢查了天氣觸摸事件是火的UIButton與否2路?

選項1:您需要在UIScrollView上添加UITapGesture。同時點擊UIScrollView。點擊關於UIScrollView的手勢返回接觸點。您需要使用以下方法將該觸點相對於主要UIView(即self.view)進行轉換。

CGPoint originInSuperview = [superview convertPoint:CGPointZero fromView:subview]; 

成功對話後,你可以檢查了天氣的觸摸點與UIButton框架或什麼互動。如果它相互作用,那麼你可以執行你將要在UIButton選擇器上執行的動作。

CGRectContainsPoint(buttonView.frame, point) 

選項2:接收到的第一觸摸事件的同時iPhone屏幕上的用戶觸摸。並將觸點重定向到當前的UIViewController。在那裏你可以檢查交互,就像在選項1中描述的那樣。並執行你的行動。

選項2已成功集成到我的一個項目中,但我忘記了收到第一個輕擊事件並重定向到當前控制器的庫。當我知道它的名字時,我會提醒你。

願這幫助你。

+1

我想我已經設法實現了這一點,不確定是否有更好的方法,但我已經用我提出的解決方案更新了我的問題。 –

+0

@Ben_hawk,感謝您的讚賞。 –