UIScrollView contentsize 属性
Posted
技术标签:
【中文标题】UIScrollView contentsize 属性【英文标题】:UIScrollView contentsize property 【发布时间】:2012-11-06 07:29:56 【问题描述】:我有一个 UIScrollView - 590 x 650 我在滚动视图中有 2 个 UIImages,尺寸:620 x 450 所以,我设置了 contentsize 和属性:
self.scroller.minimumZoomScale=0.5;
self.scroller.maximumZoomScale=6.0;
self.scroller.contentSize=CGSizeMake(1350, 950);// EDIT : 1350 because 620 + 620
//950 because 450 + 450 and 50 extra
self.scroller.contentInset=UIEdgeInsetsMake(64.0,0.0,44.0,0.0);
self.scroller.scrollIndicatorInsets=UIEdgeInsetsMake(64.0,0.0,44.0,0.0);
self.scroller.delegate=self;
但是当我尝试运行和滚动时,仅显示第二张图像的一半/部分并且滚动弹回,即使我一直拉动滚动条以显示第二张图像的结尾。
我在这里做错了什么?? 我的内容大小设置/假设是否正确?
如果这个问题已经得到解答,请指点我,因为我找不到正确的解释。
编辑: *.h 文件
@interface ViewController : UIViewController<UIScrollViewDelegate>
UIScrollView *scroller;
UIImageView *varImage1;
UILabel *lblStyle;
BOOL isAlpha;
UITextView *textView;
@property (retain, nonatomic) IBOutlet UIScrollView *scroller;
@property (retain, nonatomic) IBOutlet UIImageView *varImage1;
@property (retain, nonatomic) IBOutlet UILabel *lblStyle;
- (IBAction)notesClick:(id)sender;
@property (retain, nonatomic) IBOutlet UIButton *notesClick;
@property (retain, nonatomic) IBOutlet UITextView *textView;
@end
*.m 文件
// calculate minimum scale to perfectly fit image width, and begin at that scale
float minimumScale = [scroller frame].size.width / [varImage1 frame].size.width;
[scroller setMinimumZoomScale:minimumScale];
[scroller setZoomScale:minimumScale];
scroller.contentSize= CGSizeMake(960,1170);
scroller.delegate=self;
图片尺寸为 1170x960 UIImage 视图大小为:1170x960(宽 x 高)图片集形式 IB 和属性设置为缩放以适应。
滚动视图大小为 590 x 650(宽 x 高)
对象层次结构:
加载时的初始视图:*注意:即使图像部分显示,我也无法向右滚动并查看图像的其余部分。
缩小图像后,即使图像仅部分显示,我也可以滚动
【问题讨论】:
你的图片宽度是 620 所以 620+620= 1240 不是 1200 所以请设置内容大小 self.scroller.contentSize=CGSizeMake(1350, 950); 你说的是对的。但这无论如何都无助于回答查询。当我垂直滚动时 UIImage 仍然会反弹,并且没有完全显示第二张图像。 @Vinu,你检查过 UIScrollView 的框架吗?它是否在它的superview之外? @ACB :是的,我已经检查过了。 UIScrollView 左上角的位置在 0,0。所以那里没问题。 【参考方案1】:您能向我们展示一下您在哪里创建和添加图像的代码吗?
另外一种安全且通用的方法如下:
CGSize contentSize = CGSizeZero;
for(UIView *view in self.scroller.subviews)
contentSize.height = MAX(contentSize.height, view.frame.origin.y + view.frame.size.height);
contentSize.width = MAX(contentSize.width, view.frame.origin.x + view.frame.size.width);
CGFloat border = 50;
contentSize.height += border;
contentSize.width += border;
self.scroller.contentSize = contentSize;
它只会在scrollView中找到任何视图的最低和最右边的位置并将其用作contentSize。
【讨论】:
我从 IB 添加了图片。 你确定 imageViews 是 scrollView 的子视图吗?什么是确切的 imageView 帧?如果使用 interfaceBuilder,为什么要在代码中设置所有其他属性。你可以在那里做。 IBOutletself.scroller
连接正确吗?
可以从 IB 设置 contentSize 吗?我读到只有这个必须在代码中设置,因此我使用代码来设置值。我为滚动条制作了一个插座并正确连接,我确信它工作正常,因为我已经编写了缩放代码并且工作正常,因此插座也被正确分配和连接。图像视图,我在 IB 的滚动视图中添加了它,所以我认为它是正确的。我们可以用其他方式检查吗?/
请将 scrollView 和两个 imageView 的 frame
记录到控制台并显示给我们。还要记录最终的 contentSize。一切都设置好之后。你还在用 self.scroller 做其他事情吗?
对不起,我修改了一点内容,但问题还是一样。以上是关于UIScrollView contentsize 属性的主要内容,如果未能解决你的问题,请参考以下文章
UITableView/UIScrollView 如何自动知道 ContentSize 何时发生变化?
为啥我没有得到 UIScrollView 的实际 contentSize?
KVO - UIScrollView.contentSize误报?