我在用戶可以放大的UIScrollView中有一個視圖。如何在UIScrollView中以錨點爲中心縮放視圖?
該視圖與UIScrollView框架的大小相同。但是,這個觀點的子視圖更大,更集中。它是一個與UIScrollView具有相同大小的容器,並且具有居中內容。
縮小時,UIScrollView會將內容的比例尺改爲左上角的笨拙錨點,而不是中心點。
有沒有辦法改變這種行爲,使得當放大或縮小縮放發生在相對於中心而不是左上角時?
我在用戶可以放大的UIScrollView中有一個視圖。如何在UIScrollView中以錨點爲中心縮放視圖?
該視圖與UIScrollView框架的大小相同。但是,這個觀點的子視圖更大,更集中。它是一個與UIScrollView具有相同大小的容器,並且具有居中內容。
縮小時,UIScrollView會將內容的比例尺改爲左上角的笨拙錨點,而不是中心點。
有沒有辦法改變這種行爲,使得當放大或縮小縮放發生在相對於中心而不是左上角時?
是的我相信你可以更改anchorPoint
視圖的圖層。像這樣 -
[self.yourView.layer setAnchorPoint:CGPointMake(0.5, 0)];
錨點的座標貼切此圖中定義 -
如果你想從左邊中心錨動畫然後設置anchorPoint到(0.0, 0.5)
即點B在圖中。
行爲可以改變,以縮放中心,但技巧是棘手的。
假設您有一個大小爲(300,300)的滾動視圖,其中一個可縮放的子視圖self.imageView
最初位於(0,0,300,300)處。現在你想縮小。發生的是在您縮小時contentOffset
始終保持(0,0)。這會導致您使用左上角的錨點進行縮放的外觀。
但是,更改任何視圖上的錨點對此無濟於事;這是因爲滾動視圖的縮放行爲不僅僅是應用於某個子視圖的縮放轉換。滾動視圖中內容的外觀由contentInset
和contentOffset
控制,它們是由滾動視圖維護的單獨變量。您需要在縮放過程中修改內容偏移量和內容嵌入的行爲。
一個解決方案是在滾動視圖滾動時動態調整contentInset
。目的是保持圖像始終居中在滾動視圖的可見區域。
初始化時滾動視圖,並編制框架是這樣的:
- (void) viewDidLoad {
//// .......
self.scrollView.zoomScale = 1;
self.scrollView.minimumZoomScale = fminf(1, fminf(self.scrollView.frame.size.width/(self.imageView.image.size.width+1), self.scrollView.frame.size.height/(self.imageView.image.size.height+1)));
CGFloat leftMargin = (self.scrollView.frame.size.width - self.imageView.image.size.width)*0.5;
CGFloat topMargin = (self.scrollView.frame.size.height - self.imageView.image.size.height)*0.5;
self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
[self assignInsetsOnScroller]; // this has to be done before settings contentOffset!
self.scrollView.contentOffset = CGPointMake(fmaxf(0,-leftMargin), fmaxf(0,-topMargin));
self.scrollView.contentSize = CGSizeMake(fmaxf(self.imageView.image.size.width, self.scrollView.frame.size.width+1), fmaxf(self.imageView.image.size.height, self.scrollView.frame.size.height+1));
}
設置滾動視圖的委託,覆蓋scrollViewDidScroll:
,做這樣的事情:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self assignInsetsOnScroller];
}
- (void) assignInsetsOnScroller {
CGFloat leftMargin = (scrollView.frame.size.width - self.imageView.frame.size.width)*0.5;
CGFloat topMargin = (scrollView.frame.size.height - self.imageView.frame.size.height)*0.5;
scrollView.contentInset = UIEdgeInsetsMake(fmaxf(0, topMargin), fmaxf(0, leftMargin), 0, 0);
}
互掐手勢會引起滾動操作。結果是動態調整插頁,以便imageView
始終顯示在滾動視圖的中心。
當您在普通視圖上設置轉換時,anchorPoint將起作用。但它不會影響scrollview內容的行爲。請參閱下面的答案。 – winitzki