我有一个UIImageView
一个内部UIScrollView
,我使用缩放和滚动。 如果滚动视图的图像/内容大于滚动视图更大,一切工作正常。 然而,当图像变得比滚动视图较小,它坚持滚动视图的左上角。 我想保持它为中心,像照片应用程序。
关于保持的内容任何意见或例子UIScrollView
时,它的体积更小的中心?
我与iPhone 3.0的工作。
下面的代码几乎工作。 图像返回到左上角,如果我达到最低缩放级别后偷走。
- (void)loadView {
[super loadView];
// set up main scroll view
imageScrollView = [[UIScrollView alloc] initWithFrame:[[self view] bounds]];
[imageScrollView setBackgroundColor:[UIColor blackColor]];
[imageScrollView setDelegate:self];
[imageScrollView setBouncesZoom:YES];
[[self view] addSubview:imageScrollView];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"WeCanDoIt.png"]];
[imageView setTag:ZOOM_VIEW_TAG];
[imageScrollView setContentSize:[imageView frame].size];
[imageScrollView addSubview:imageView];
CGSize imageSize = imageView.image.size;
[imageView release];
CGSize maxSize = imageScrollView.frame.size;
CGFloat widthRatio = maxSize.width / imageSize.width;
CGFloat heightRatio = maxSize.height / imageSize.height;
CGFloat initialZoom = (widthRatio > heightRatio) ? heightRatio : widthRatio;
[imageScrollView setMinimumZoomScale:initialZoom];
[imageScrollView setZoomScale:1];
float topInset = (maxSize.height - imageSize.height) / 2.0;
float sideInset = (maxSize.width - imageSize.width) / 2.0;
if (topInset < 0.0) topInset = 0.0;
if (sideInset < 0.0) sideInset = 0.0;
[imageScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return [imageScrollView viewWithTag:ZOOM_VIEW_TAG];
}
/************************************** NOTE **************************************/
/* The following delegate method works around a known bug in zoomToRect:animated: */
/* In the next release after 3.0 this workaround will no longer be necessary */
/**********************************************************************************/
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
[scrollView setZoomScale:scale+0.01 animated:NO];
[scrollView setZoomScale:scale animated:NO];
// END Bug workaround
CGSize maxSize = imageScrollView.frame.size;
CGSize viewSize = view.frame.size;
float topInset = (maxSize.height - viewSize.height) / 2.0;
float sideInset = (maxSize.width - viewSize.width) / 2.0;
if (topInset < 0.0) topInset = 0.0;
if (sideInset < 0.0) sideInset = 0.0;
[imageScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}
Answer 1:
我有很简单的解决方案! 所有你需要的是更新您的子视图(ImageView的)的中心,而在ScrollViewDelegate变焦。 如果缩放图像小于滚动视图然后调整subview.center其他中心为(0,0)。
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
UIView *subView = [scrollView.subviews objectAtIndex:0];
CGFloat offsetX = MAX((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0);
CGFloat offsetY = MAX((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0);
subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX,
scrollView.contentSize.height * 0.5 + offsetY);
}
Answer 2:
@ EvelynCordner的回答是,在我的应用效果最好的一个。 少了很多的代码比其他的选择了。
以下是雨燕的版本,如果有人需要它:
func scrollViewDidZoom(_ scrollView: UIScrollView) {
let offsetX = max((scrollView.bounds.width - scrollView.contentSize.width) * 0.5, 0)
let offsetY = max((scrollView.bounds.height - scrollView.contentSize.height) * 0.5, 0)
scrollView.contentInset = UIEdgeInsetsMake(offsetY, offsetX, 0, 0)
}
Answer 3:
好吧,我一直在争取这个在过去的两天和关闭,并具有终于来到,我想我应该分享并保存其他一些疼痛相当可靠(到目前为止...)解决方案。 :)如果你发现一个问题,这个解决方案,请留言!
我基本上是通过别人都已经:搜索StackOverflow上,苹果开发者论坛,看着为three20代码,ScrollingMadness,ScrollTestSuite,等我试过扩大UIImageView的框架,与UIScrollView的偏移和/或插图打从视图控制器等,但没有伟大的工作(如其他人已经发现了太)。
睡在它之后,我尝试了几个替代角度:
- 子类的UIImageView所以它改变了它动态自身的大小 - 这一点都没有很好地工作。
- 子类化的UIScrollView所以它改变了它自己的contentOffset动态 - 这是这似乎是对我来说是赢家之一。
有了这个子类UIScrollView的方法,我重写contentOffset突变所以它不是设置{0,0}当对图像进行缩放比视小 - 而不是它的设置偏移,使得图像将保持集中在视口中。 到目前为止,它似乎总是工作。 我已经与宽,高,细小及大图像检查,并没有“的作品,但在捏最小缩放打破它”的问题。
我上传一个例子项目github上使用此解决方案,您可以在这里找到: http://github.com/nyoron/NYOBetterZoom
Answer 4:
此代码应在iOS上的大多数版本的工作(并已经过测试,对工作3.1以上)。
它是基于对photoscoller苹果WWDC代码。
添加以下到您的UIScrollView的子类,以及包含图像或砖视图替换tileContainerView:
- (void)layoutSubviews {
[super layoutSubviews];
// center the image as it becomes smaller than the size of the screen
CGSize boundsSize = self.bounds.size;
CGRect frameToCenter = tileContainerView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
frameToCenter.origin.x = 0;
// center vertically
if (frameToCenter.size.height < boundsSize.height)
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
frameToCenter.origin.y = 0;
tileContainerView.frame = frameToCenter;
}
Answer 5:
为了更好的适合使用自动布局滚动视图的解决方案,使用滚动视图内容的插图,而不是更新的滚动视图的子视图的帧。
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
CGFloat offsetX = MAX((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0);
CGFloat offsetY = MAX((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0);
self.scrollView.contentInset = UIEdgeInsetsMake(offsetY, offsetX, 0.f, 0.f);
}
Answer 6:
目前我继承UIScrollView
和压倒一切的setContentOffset:
到偏移基于调整contentSize
。 它的工作原理都与捏和程序化缩放。
@implementation HPCenteringScrollView
- (void)setContentOffset:(CGPoint)contentOffset
{
const CGSize contentSize = self.contentSize;
const CGSize scrollViewSize = self.bounds.size;
if (contentSize.width < scrollViewSize.width)
{
contentOffset.x = -(scrollViewSize.width - contentSize.width) / 2.0;
}
if (contentSize.height < scrollViewSize.height)
{
contentOffset.y = -(scrollViewSize.height - contentSize.height) / 2.0;
}
[super setContentOffset:contentOffset];
}
@end
除了作为短期和甜蜜,这段代码产生比@Erdemus解决方案更加平滑变焦。 你可以看到它在行动RMGallery演示。
Answer 7:
我花了一天这个问题的战斗,并最终实现scrollViewDidEndZooming:withView:atScale:如下:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width;
CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
CGFloat viewWidth = view.frame.size.width;
CGFloat viewHeight = view.frame.size.height;
CGFloat x = 0;
CGFloat y = 0;
if(viewWidth < screenWidth) {
x = screenWidth / 2;
}
if(viewHeight < screenHeight) {
y = screenHeight / 2 ;
}
self.scrollView.contentInset = UIEdgeInsetsMake(y, x, y, x);
}
这保证了在图像比屏幕小,还是有它周围有足够的空间,以便您可以将其定位到您想要的确切地点。
(假设你的UIScrollView包含的UIImageView保存图像)
从本质上讲,这是什么做的是检查您的图像视图的宽度/高度是否是屏幕的宽度/高度小,如果是这样,创建屏幕的宽度/高度的一半插图(如果你想要的形象,你很可能使这个大走出屏幕边界的)。
请注意,因为这是一个UIScrollViewDelegate方法,不要忘了将它添加到您的视图控制器的声明,因此要避免让构建问题。
Answer 8:
苹果已经发布了2010年WWDC会议视频到iPhone开发计划的所有成员。 其中一个讨论的主题是如何创建的照片应用程序! 他们建立一步一个非常类似的应用程序的步骤,并已取得免费提供的所有代码。
它没有任何使用私有API。 我不能把任何代码在这里,因为非公开协议,但这里是示例代码下载的链接。 您可能需要登录才能访问。
http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645
而且,这里是iTunes的WWDC页面的链接:
http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj
Answer 9:
好了,该解决方案为我工作。 我有一个子类UIScrollView
与该参考UIImageView
它显示。 每当UIScrollView
缩放,该contentSize属性进行调整。 这是我缩放的setter UIImageView
适当,也可以调整它的中心位置。
-(void) setContentSize:(CGSize) size{
CGSize lSelfSize = self.frame.size;
CGPoint mid;
if(self.zoomScale >= self.minimumZoomScale){
CGSize lImageSize = cachedImageView.initialSize;
float newHeight = lImageSize.height * self.zoomScale;
if (newHeight < lSelfSize.height ) {
newHeight = lSelfSize.height;
}
size.height = newHeight;
float newWidth = lImageSize.width * self.zoomScale;
if (newWidth < lSelfSize.width ) {
newWidth = lSelfSize.width;
}
size.width = newWidth;
mid = CGPointMake(size.width/2, size.height/2);
}
else {
mid = CGPointMake(lSelfSize.width/2, lSelfSize.height/2);
}
cachedImageView.center = mid;
[super setContentSize:size];
[self printLocations];
NSLog(@"zoom %f setting size %f x %f",self.zoomScale,size.width,size.height);
}
Evertime我设置在图像UIScrollView
我调整其大小。 的UIScrollView
的滚动视图也是我创建了一个自定义类。
-(void) resetSize{
if (!scrollView){//scroll view is view containing imageview
return;
}
CGSize lSize = scrollView.frame.size;
CGSize lSelfSize = self.image.size;
float lWidth = lSize.width/lSelfSize.width;
float lHeight = lSize.height/lSelfSize.height;
// choose minimum scale so image width fits screen
float factor = (lWidth<lHeight)?lWidth:lHeight;
initialSize.height = lSelfSize.height * factor;
initialSize.width = lSelfSize.width * factor;
[scrollView setContentSize:lSize];
[scrollView setContentOffset:CGPointZero];
scrollView.userInteractionEnabled = YES;
}
这两种方法我能有行为就像照片应用程序的视图。
Answer 10:
你可以看contentSize
的UIScrollView的财产(使用键-值观察或类似),并自动调整contentInset
每当contentSize
的变化小于滚动视图的大小。
Answer 11:
一个优雅的方式来中心的内容UISCrollView
是这样的。
一个观察者添加到您的contentSize UIScrollView
,所以这种方法将被调用每次含量的变化...
[myScrollView addObserver:delegate
forKeyPath:@"contentSize"
options:(NSKeyValueObservingOptionNew)
context:NULL];
现在,你的观察方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
// Correct Object Class.
UIScrollView *pointer = object;
// Calculate Center.
CGFloat topCorrect = ([pointer bounds].size.height - [pointer viewWithTag:100].bounds.size.height * [pointer zoomScale]) / 2.0 ;
topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
topCorrect = topCorrect - ( pointer.frame.origin.y - imageGallery.frame.origin.y );
// Apply Correct Center.
pointer.center = CGPointMake(pointer.center.x,
pointer.center.y + topCorrect ); }
这将修正内容,每次他的身材变化的中心。
注:本内容不工作得非常好,唯一的方法是使用标准的缩放功能UIScrollView
。
Answer 12:
这是我解决这个问题这对任何类型的视图滚动视图中工作得很好。
-(void)scrollViewDidZoom:(__unused UIScrollView *)scrollView
{
CGFloat top;
CGFloat left;
CGFloat bottom;
CGFloat right;
if (_scrollView.contentSize.width < scrollView.bounds.size.width) {
DDLogInfo(@"contentSize %@",NSStringFromCGSize(_scrollView.contentSize));
CGFloat width = (_scrollView.bounds.size.width-_scrollView.contentSize.width)/2.0;
left = width;
right = width;
}else {
left = kInset;
right = kInset;
}
if (_scrollView.contentSize.height < scrollView.bounds.size.height) {
CGFloat height = (_scrollView.bounds.size.height-_scrollView.contentSize.height)/2.0;
top = height;
bottom = height;
}else {
top = kInset;
right = kInset;
}
_scrollView.contentInset = UIEdgeInsetsMake(top, left, bottom, right);
if ([self.tiledScrollViewDelegate respondsToSelector:@selector(tiledScrollViewDidZoom:)])
{
[self.tiledScrollViewDelegate tiledScrollViewDidZoom:self];
}
}
Answer 13:
有有的是解决方案在这里,但我会冒险把这里我自己。 这是很好的,原因有二:不乱变焦的经验,会做更新的进展图像视图帧,并且也尊重原滚动视图插图(比方说,在厦门国际银行或故事板定义为半透明的工具栏等的适度处理) 。
首先,定义一个小帮手:
CGSize CGSizeWithAspectFit(CGSize containerSize, CGSize contentSize) {
CGFloat containerAspect = containerSize.width / containerSize.height,
contentAspect = contentSize.width / contentSize.height;
CGFloat scale = containerAspect > contentAspect
? containerSize.height / contentSize.height
: containerSize.width / contentSize.width;
return CGSizeMake(contentSize.width * scale, contentSize.height * scale);
}
要保留原来的插图,定义字段:
UIEdgeInsets originalScrollViewInsets;
而在某个地方填写viewDidLoad中它:
originalScrollViewInsets = self.scrollView.contentInset;
要放置的UIImageView到的UIScrollView(假设的UIImage本身是loadedImage VAR):
CGSize containerSize = self.scrollView.bounds.size;
containerSize.height -= originalScrollViewInsets.top + originalScrollViewInsets.bottom;
containerSize.width -= originalScrollViewInsets.left + originalScrollViewInsets.right;
CGSize contentSize = CGSizeWithAspectFit(containerSize, loadedImage.size);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:(CGRect) { CGPointZero, contentSize }];
imageView.autoresizingMask = UIViewAutoresizingNone;
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.image = loadedImage;
[self.scrollView addSubview:imageView];
self.scrollView.contentSize = contentSize;
[self centerImageViewInScrollView];
scrollViewDidZoom:从UIScrollViewDelegate该滚动视图:
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
if (scrollView == self.scrollView) {
[self centerImageViewInScrollView];
}
}
一个最终,中心本身:
- (void)centerImageViewInScrollView {
CGFloat excessiveWidth = MAX(0.0, self.scrollView.bounds.size.width - self.scrollView.contentSize.width),
excessiveHeight = MAX(0.0, self.scrollView.bounds.size.height - self.scrollView.contentSize.height),
insetX = excessiveWidth / 2.0,
insetY = excessiveHeight / 2.0;
self.scrollView.contentInset = UIEdgeInsetsMake(
MAX(insetY, originalScrollViewInsets.top),
MAX(insetX, originalScrollViewInsets.left),
MAX(insetY, originalScrollViewInsets.bottom),
MAX(insetX, originalScrollViewInsets.right)
);
}
我没有测试的方向变化,但(对于调整的UIScrollView本身即适当的反应),但修为,应该是比较容易的。
Answer 14:
你会发现,张贴Erdemus解决方案的工作,但......有些情况下scrollViewDidZoom方法不被调用和图像粘贴到左上角。 一个简单的解决方案是显式地调用的方法时最初显示的图像,如下所示:
[self scrollViewDidZoom: scrollView];
在很多情况下,你可以进行两次调用此方法,但是这是比一些本主题中的其他答案的一个清晰的解决方案。
Answer 15:
苹果的照片滚轮例不正是你所期待的。 把这个在您的UIScrollView子类,并更改_zoomView是你的UIImageView。
-(void)layoutSubviews{
[super layoutSubviews];
// center the zoom view as it becomes smaller than the size of the screen
CGSize boundsSize = self.bounds.size;
CGRect frameToCenter = self.imageView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width){
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
}else{
frameToCenter.origin.x = 0;
}
// center vertically
if (frameToCenter.size.height < boundsSize.height){
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
}else{
frameToCenter.origin.y = 0;
}
self.imageView.frame = frameToCenter;
}
苹果的照片滚轮示例代码
Answer 16:
我这样做的方法是添加一个额外的视图成层次结构:
UIScrollView -> UIView -> UIImageView
给你UIView
相同的宽高比为您UIScrollView
,和中心您UIImageView
成。
Answer 17:
为了使动画流很好,设置
self.scrollview.bouncesZoom = NO;
和使用该功能(发现在使用该方法的中心此答案 )
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
[UIView animateWithDuration:0.2 animations:^{
float offsetX = MAX((scrollView.bounds.size.width-scrollView.contentSize.width)/2, 0);
float offsetY = MAX((scrollView.bounds.size.height-scrollView.contentSize.height)/2, 0);
self.imageCoverView.center = CGPointMake(scrollView.contentSize.width*0.5+offsetX, scrollView.contentSize.height*0.5+offsetY);
}];
}
这将创建弹跳效果,但事先不涉及任何突然的动作。
Answer 18:
就在迅速批准的答案,但没有使用委托继承
func centerScrollViewContents(scrollView: UIScrollView) {
let contentSize = scrollView.contentSize
let scrollViewSize = scrollView.frame.size;
var contentOffset = scrollView.contentOffset;
if (contentSize.width < scrollViewSize.width) {
contentOffset.x = -(scrollViewSize.width - contentSize.width) / 2.0
}
if (contentSize.height < scrollViewSize.height) {
contentOffset.y = -(scrollViewSize.height - contentSize.height) / 2.0
}
scrollView.setContentOffset(contentOffset, animated: false)
}
// UIScrollViewDelegate
func scrollViewDidZoom(scrollView: UIScrollView) {
centerScrollViewContents(scrollView)
}
Answer 19:
如果你内心的ImageView具有初始特定宽度(例如300),你只是要居中其宽度仅比变焦的初始宽度,这可能帮助你也较小。
func scrollViewDidZoom(scrollView: UIScrollView){
if imageView.frame.size.width < 300{
imageView.center.x = self.view.frame.width/2
}
}
Answer 20:
下面是我在做这项工作目前的方式。 这是更好,但还不够完善。 尝试设置:
myScrollView.bouncesZoom = YES;
与在当视图不居中解决问题minZoomScale
。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGSize screenSize = [[self view] bounds].size;//[[UIScreen mainScreen] bounds].size;//
CGSize photoSize = [yourImage size];
CGFloat topInset = (screenSize.height - photoSize.height * [myScrollView zoomScale]) / 2.0;
CGFloat sideInset = (screenSize.width - photoSize.width * [myScrollView zoomScale]) / 2.0;
if (topInset < 0.0)
{ topInset = 0.0; }
if (sideInset < 0.0)
{ sideInset = 0.0; }
[myScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
ApplicationDelegate *appDelegate = (ApplicationDelegate *)[[UIApplication sharedApplication] delegate];
CGFloat scrollViewHeight; //Used later to calculate the height of the scrollView
if (appDelegate.navigationController.navigationBar.hidden == YES) //If the NavBar is Hidden, set scrollViewHeight to 480
{ scrollViewHeight = 480; }
if (appDelegate.navigationController.navigationBar.hidden == NO) //If the NavBar not Hidden, set scrollViewHeight to 360
{ scrollViewHeight = 368; }
imageView.frame = CGRectMake(0, 0, CGImageGetWidth(yourImage)* [myScrollView zoomScale], CGImageGetHeight(yourImage)* [myScrollView zoomScale]);
[imageView setContentMode:UIViewContentModeCenter];
}
另外,我这样做,以防止缩小后坚持一个侧面的图像。
- (void) scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
myScrollView.frame = CGRectMake(0, 0, 320, 420);
//put the correct parameters for your scroll view width and height above
}
Answer 21:
好吧,我想我已经找到一个很好的解决了这个问题。 诀窍是不断调整的imageView's
框架。 我觉得这个作品比不断调整要好得多contentInsets
或contentOffSets
。 我不得不添加一些额外的代码,以适应纵向和横向的图像。
下面的代码:
- (void) scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
CGSize screenSize = [[self view] bounds].size;
if (myScrollView.zoomScale <= initialZoom +0.01) //This resolves a problem with the code not working correctly when zooming all the way out.
{
imageView.frame = [[self view] bounds];
[myScrollView setZoomScale:myScrollView.zoomScale +0.01];
}
if (myScrollView.zoomScale > initialZoom)
{
if (CGImageGetWidth(temporaryImage.CGImage) > CGImageGetHeight(temporaryImage.CGImage)) //If the image is wider than tall, do the following...
{
if (screenSize.height >= CGImageGetHeight(temporaryImage.CGImage) * [myScrollView zoomScale]) //If the height of the screen is greater than the zoomed height of the image do the following...
{
imageView.frame = CGRectMake(0, 0, 320*(myScrollView.zoomScale), 368);
}
if (screenSize.height < CGImageGetHeight(temporaryImage.CGImage) * [myScrollView zoomScale]) //If the height of the screen is less than the zoomed height of the image do the following...
{
imageView.frame = CGRectMake(0, 0, 320*(myScrollView.zoomScale), CGImageGetHeight(temporaryImage.CGImage) * [myScrollView zoomScale]);
}
}
if (CGImageGetWidth(temporaryImage.CGImage) < CGImageGetHeight(temporaryImage.CGImage)) //If the image is taller than wide, do the following...
{
CGFloat portraitHeight;
if (CGImageGetHeight(temporaryImage.CGImage) * [myScrollView zoomScale] < 368)
{ portraitHeight = 368;}
else {portraitHeight = CGImageGetHeight(temporaryImage.CGImage) * [myScrollView zoomScale];}
if (screenSize.width >= CGImageGetWidth(temporaryImage.CGImage) * [myScrollView zoomScale]) //If the width of the screen is greater than the zoomed width of the image do the following...
{
imageView.frame = CGRectMake(0, 0, 320, portraitHeight);
}
if (screenSize.width < CGImageGetWidth (temporaryImage.CGImage) * [myScrollView zoomScale]) //If the width of the screen is less than the zoomed width of the image do the following...
{
imageView.frame = CGRectMake(0, 0, CGImageGetWidth(temporaryImage.CGImage) * [myScrollView zoomScale], portraitHeight);
}
}
[myScrollView setZoomScale:myScrollView.zoomScale -0.01];
}
Answer 22:
只是禁用分页,所以它会很好地工作:
scrollview.pagingEnabled = NO;
Answer 23:
我有同样的问题。 这是我如何解决
此代码应该得到被称为结果scrollView:DidScroll:
CGFloat imageHeight = self.imageView.frame.size.width * self.imageView.image.size.height / self.imageView.image.size.width;
BOOL imageSmallerThanContent = (imageHeight < self.scrollview.frame.size.height) ? YES : NO;
CGFloat topOffset = (self.imageView.frame.size.height - imageHeight) / 2;
// If image is not large enough setup content offset in a way that image is centered and not vertically scrollable
if (imageSmallerThanContent) {
topOffset = topOffset - ((self.scrollview.frame.size.height - imageHeight)/2);
}
self.scrollview.contentInset = UIEdgeInsetsMake(topOffset * -1, 0, topOffset * -1, 0);
Answer 24:
虽然问题是有点老了,但仍存在问题。 我解决了它在Xcode 7通过使最上层项目的垂直空间的限制(在这种情况下, topLabel
)到superViews(在scrollView
)顶部的IBOutlet
,然后其不断每次重新计算依据的滚动视图的高度含量的变化子视图( topLabel
和bottomLabel
)。
class MyViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var topLabel: UILabel!
@IBOutlet weak var bottomLabel: UILabel!
@IBOutlet weak var toTopConstraint: NSLayoutConstraint!
override func viewDidLayoutSubviews() {
let heightOfScrollViewContents = (topLabel.frame.origin.y + topLabel.frame.size.height - bottomLabel.frame.origin.y)
// In my case abs() delivers the perfect result, but you could also check if the heightOfScrollViewContents is greater than 0.
toTopConstraint.constant = abs((scrollView.frame.height - heightOfScrollViewContents) / 2)
}
func refreshContents() {
// Set the label's text …
self.view.layoutIfNeeded()
}
}
文章来源: Center content of UIScrollView when smaller