2016-12-13 153 views
2

我有一個UIScrollView在向左或向右滑動時工作,但是我縮小了scrollView的大小,所以現在顯示區域不會完全佔據superview的框架,並且只能滑動在滾動視圖的框架內。ScrollView - 手勢識別器 - 垂直滑動

即使在縮小滾動視圖的水平範圍外上下滑動,我也希望能夠垂直滾動。

建議我使用手勢識別器,但這超出了我目前對iOS的熟悉程度,可能會使用更具體的建議或更多的指導來開始使用。

+0

見http://stackoverflow.com/a/43328905/5173807 – 9it3e1

回答

2

有一個更簡單的方法,然後使用手勢識別器=]

您可以設置滾動視圖的超級視圖(這是較大的...)以將觸摸傳遞給滾動視圖。它正在工作M-A-G-I-C-A-L-Y =]

首先,選擇將所有觸摸傳遞給滾動視圖的視圖。如果你的父視圖已經可以使用它。否則你應該考慮添加一個新的視圖,你想要的大小會觸及到。

現在創建一個新的類(我將使用的例如SWIFT)

class TestView: UIView { 

    @IBOutlet weak var Scroller: UIScrollView! 

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 

     let view = super.hitTest(point, with: event) 

     if (view == self) { 
      return Scroller 
     } 

     return view 

    } 

} 

不錯!現在,您可以看到我們添加了滾動條的出口。因此請使用界面構建器,選擇新視圖並將其類別設置爲身份檢查員(或將用於您的自定義班級的名稱)中的「TestView」。

當您設置了課程並且您的視圖仍處於選中狀態後,請轉至連接檢查員並將「Scroller」連接到故事板上的滾動視圖。所有正確連接=]

就是這樣!不需要手勢識別器! 新觀點將通過一切的觸摸滾動視圖,它會表現得就像你在它平移=]

在我的答案我用that answer

編輯:我現在改進了代碼,它不工作像以前預期的,現在它捕獲只在需要,而不是在應用程序中每一個接觸像以前

+0

它的工作。但是,你可以用手勢識別器來做嗎? – mumu

+0

我試過......我可以嘗試更多。但爲什麼? – Yitzchak

+0

教練要求使用手勢來做到這一點。這就是爲什麼。 – mumu

0

我沒有時間詳細回答,但:

在故事板拖動滾動視圖的上海華盈泛手勢識別...連接它的行動,您的視圖控制器並在行動改變滾動視圖位置通過使用來自你得到的參數

提示手勢識別屬性:在組合框中從Any動作變化參數類型連接到UIPanGestureRecognizer

請不要看到這個答案作爲建議在你的問題中使用這種方法,我不知道這是最好的方式,我只是幫你試試

+0

嘿,感謝您的answere。當我回到家時,我會嘗試一下,如果它有效,請發表評論。 – Glatteisen

+0

它幫助你? – Yitzchak

+0

我試過,但我沒有時間再次評論這一點,對不起。 我試着理解你所說的話,並且據我所知,我編碼了。現在,我真的不知道手勢識別器屬性是什麼,所以我只是把這段代碼放在ViewController.swift中:@IBAction func ScrollOver(_ sender:UIPanGestureRecognizer){ scrollView.frame.size.width = 320 } 正如我所說的scrollView比superview小,但scrollView有一個顏色,所以這個額外的代碼我已經寫了scrollView大小增長和它的顏色,所以它有點不是我想要做的。 – Glatteisen

1
  1. 搜索一個組件調用時SwipeGestureRecognizerenter image description here

  2. 抓住它,並把它在視圖的頂部(使用層次結構,以確保 它掉在地上就可以了,如果你刪除它的另一個元素這個代碼將無法正常工作的):

    enter image description here

  3. 從層次結構中選擇一個SwipeGestureRecognizer並轉到其屬性頁。將滑動更改爲右側。

enter image description here

  • 確保其他識別器具有滑動屬性到左
  • enter image description here

  • 選擇UIScrollView並取消選中滾動啓用
  • enter image description here

  • 連接detectSwipe()(見下文源代碼)到兩個識別器。
  • -

    @IBAction func detectSwipe (_ sender: UISwipeGestureRecognizer) { 
        if (currentPage < MAX_PAGE && sender.direction == UISwipeGestureRecognizerDirection.left) { 
         moveScrollView(direction: 1) 
        } 
        if (currentPage > MIN_PAGE && sender.direction == UISwipeGestureRecognizerDirection.right) { 
         moveScrollView(direction: -1) 
        } 
    } 
    
    
    
    func moveScrollView(direction: Int) { 
        currentPage = currentPage + direction 
        let point: CGPoint = CGPoint(x: scrollView.frame.size.width * CGFloat(currentPage), y: 0.0) 
        scrollView.setContentOffset(point, animated: true)  
    
        // Create a animation to increase the actual icon on screen 
        UIView.animate(withDuration: 0.4) { 
         self.images[self.currentPage].transform = CGAffineTransform.init(scaleX: 1.4, y: 1.4) 
         for x in 0 ..< self.images.count { 
          if (x != self.currentPage) { 
           self.images[x].transform = CGAffineTransform.identity 
          } 
         } 
        } 
    }  
    

    參考https://github.com/alxsnchez/scrollViewSwipeGestureRecognizer更多