我在用户可以放大的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