> 原文:http://www.swiftyper.com/Swift/scrollviewpart4.html
# ScrollView 學習筆記 - Part4
前一節學了`ScrollView`當中的縮放,不過那個縮放實現得并不完美,因為縮放過后,圖片只會靜靜地呆在屏幕的一邊,一般情況,我們希望縮放后的圖片能夠居中。
要實現居中,其實并不復雜,我們只需要計算出`ScrollView`與`ImageView`的寬與高的差值,然后再除以2就可以算出補白的間距。如圖:

有了這個補白的間距,我們就可以設置`ImageView`的`frame`來設置它的位置,使其居中。
還有另一個方法是設置`ScrollView`的`ContentInset`,也能實現居中。

## 實現居中
可以實現下面這個方面用來對縮放后的`View`進行居中:
~~~
private func recenterImage() {
let scrollViewSize = scrollView.frame.size
let imageSize = imageView.frame.size
let horizontalSpace = imageSize.width < scrollViewSize.width ?
(scrollViewSize.width - imageSize.width) / 2 : 0
let verticalSpace = imageSize.height < scrollViewSize.height ?
(scrollViewSize.height - imageSize.height) / 2 : 0
scrollView.contentInset = UIEdgeInsets(top: verticalSpace, left: horizontalSpace, bottom: verticalSpace, right: horizontalSpace)
}
~~~
在`ViewDidLoad`、`viewWillLayoutSubviews`與`scrollViewDidZoom`當中調用這個方法,就能實現縮放后的圖片居中了。
## 屏幕旋轉后圖片位置發生變化
當我們將圖片放大后對屏幕進行旋轉,會發現,圖片的中心發生了改變,不在原本的位置。這是因為雖然`ScrollView`的`contentOffset`沒有變化,但是由于屏幕的大小改變了,會影響到中心位置,所以我們可以看到圖片的位置發生了變化。

要解決這個問題,我們需要在屏幕旋轉前記錄中心點的位置,然后在旋轉后,再根據這個中心點的位置來設置`contentOffset`,這樣就能保證旋轉前后的中心在同一個位置。我們可以在一個方法中完成所有的這些工作:
~~~
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
// 計算中心點
let centerPoint = CGPoint(x: scrollView.contentOffset.x + CGRectGetWidth(scrollView.bounds) / 2,
y: scrollView.contentOffset.y + CGRectGetHeight(scrollView.bounds) / 2)
// 設置旋轉后的中心位置
coordinator.animateAlongsideTransition({ (context) -> Void in
self.scrollView.contentOffset = CGPoint(x: centerPoint.x - size.width / 2, y: centerPoint.y - size.height / 2)
}, completion: nil)
}
~~~
`viewWillTrnsitionToSize(_:withTransitionCoordinator:)`是iOS 8中的新方法,這個方法可以讓你屏幕旋轉的時候對view進行一些操作,其中的`size`參數是旋轉后的view的大小。經過這樣的處理之后,旋轉前后的中心都會在同一個位置了。
## 總結
這小節主要是對縮放的效果進行了一些小的優化,使它看起來不至于太山寨,主要是一些計算的東西,只要想通了也就不困難了。