2016-12-01 11 views
3

ズームに問題がありますUIImageViewです。 ズームUIImageView:ズーム用のビューが呼び出されても何も起こらない

は非常に単純な、私の UIViewController持って次のような構造を理解するために:

私はちょうど画像のコレクションを持っています。画面には一度に1つの画像しか表示されませんが、他の画像を見るには左右にスクロールできます。 (Appleの写真アプリのように)。これらの画像にズーム機能が必要です。

は私が UIScrollView(画像につき1)多くを含むメイン UIScrollViewを持っている:

これは私のUIViewControllerが作動しているかです。基本的には、それぞれUIScrollViewには、UIImageViewがあります。 (私はズームを可能にするためにUICollectionViewを使用しなかった:各画像をズームできるように、UIScrollViewにはUIImageViewが含まれています)。

これは、それがどのように見えるかです:

enter image description here

これは私がそれをやった方法です:

var counter : Int = 0 
let scrollViewWidth:CGFloat = scrollView.frame.width 
let scrollViewHeight:CGFloat = scrollView.frame.height 

// Add images to scrollview 
for object in myObjects { 
    // Configure the UIImageView 
    let imgView = UIImageView(image: object.image.value) 
    imgView.frame = CGRect(x:0, y:0, width:scrollViewWidth, height:scrollViewHeight) 
    imgView.contentMode = .scaleAspectFit 
    imgView.isUserInteractionEnabled = true 
    if let rotation = viewModel?.documents?[counter].rotation { 
     imgView.transform = CGAffineTransform(rotationAngle: rotation) 
    } 

    // Configure a UIScrollView for each UIImageView to allow both zooming and paging 
    let pageScrollView = UIScrollView(frame: CGRect(x:scrollViewWidth * CGFloat(counter), y:0, width:scrollViewWidth, height:scrollViewHeight)) 
    pageScrollView.minimumZoomScale = 1.0 
    pageScrollView.maximumZoomScale = 2.0 
    pageScrollView.contentSize = imgView.bounds.size 
    pageScrollView.showsVerticalScrollIndicator = false 
    pageScrollView.showsHorizontalScrollIndicator = false 
    pageScrollView.addSubview(imgView) 
    self.scrollView.addSubview(pageScrollView) 
    counter += 1 
} 

// Set content size for the main UIScrollView 
self.scrollView.contentSize = CGSize(width:self.scrollView.frame.width * CGFloat((viewModel?.documents)!.count), height:self.scrollView.frame.height) 

は明らかに私はviewForZoomingメソッドを実装:メソッドが呼び出され、この方法は、右を返します。 UIImageView、ズームするにはピンチで何も起こりません:

/// Zoom in/out for the current UIImageView 
public func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    // self.scrollView : main UIScrollView 
    if scrollView == self.scrollView { 
     if let childScrollView = self.scrollView.subviews[currentPageIndex] as? UIScrollView { 
      if let currentImageView = childScrollView.subviews[0] as? UIImageView { 
       return currentImageView // the UIImageView is well returned 
      } 
     } 
    } 
    return nil 
} 

誰かがアイデアを持っていると私は分かりません。

ありがとうございました。

+0

あなたは 'UIPinchGestureRecognizer'も実装する必要があります。 – Poles

+0

これをチェックしてくださいhttp://stackoverflow.com/questions/500027/how-to-zoom-in-out-an-uiimage-object-when-user-pinches-screen – Poles

答えて

0

すべてのpageScrollViewにデリゲートを設定します(self.scrollViewでは使用できません)。 viewForZoomingで、適切なサブビューを返します。 例(擬似コード):

public func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    // self.scrollView : main UIScrollView 
    if <scrollView ONE_OF self.pageScrollViews> { 
     return self.getContentViewForPageScrollView(scrollView); 
    } 
} 
return nil 

Hereあなたはレイアウト機能の最小とサン​​プルプロジェクトを見つけることができます。

}

+0

私は両方のデリゲートが必要です。 'self.scrollView 'と他の子のscrollViewsにも適用されます。しかし、私は私の問題を解決し、あなたの時間をありがとう – AnthonyR

0

解決済み。実際には、デリゲートを私のメインのUIScrollViewともう1つのUIScrollViewの両方に設定したので、viewForZoomingメソッドはどのscrollViewが使用されたのかわかりませんでした。メソッドで使用されるscrollViewがメインUIScrollViewif scrollView == self.scrollView)だったかどうかをテストする代わりに、スクロールビューがのメインUIScrollViewであるかどうかをテストする必要があります。このよう

/// Zoom in/out for the current UIImageView 
public func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    // I removed the test for the main UIScrollView... 
    if let childScrollView = self.scrollView.subviews[currentPageIndex] as? UIScrollView { 
     if let currentImageView = childScrollView.subviews[0] as? UIImageView { 
      // ...And now I test if the scrollView is the child 
      if scrollView == childScrollView { 
       return currentImageView 
      } 
     } 
    } 
    return nil 
} 

は、今では動作します!

関連する問題