小编Cor*_*rey的帖子

UIScrollView缩放不适用于Autolayout

使用严格的自动布局环境缩放UIScrollView似乎不起作用.

这特别令人沮丧,因为iOS 6发行说明肯定让我相信它应该在写下关于"纯自动布局方法"的时候http://developer.apple.com/library/ios/#releasenotes/General/RN- iOSSDK-6_0/_index.html

我查看了WWDC 2012幻灯片的会话202,228和232,并没有看到答案.

我在互联网上专门针对这个问题看到的唯一问题是UIScrollView使用自动布局进行缩放,但是它没有提供问题的代码,也没有答案.

这个用户/sf/users/23939611/对UIScrollView自动布局问题给出了很多很好的回复,甚至链接到git hub上的代码,但我找不到任何可以解决这个问题的东西.

我试图将这个问题降到最低限度,以便明确.

我使用故事板创建了一个新的单视图应用程序,并且在界面构建器中没有进行任何更改.

我在项目"pic.jpg"中添加了一个大图片文件.

SVFViewController.h

#import <UIKit/UIKit.h> 
@interface SVFViewController : UIViewController <UIScrollViewDelegate>
@property (nonatomic) UIImageView *imageViewPointer;
@end
Run Code Online (Sandbox Code Playgroud)

SVFViewController.m

#import "SVFViewController.h"

@interface SVFViewController ()

@end

@implementation SVFViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIScrollView *scrollView = [[UIScrollView alloc] init];
    UIImageView *imageView = [[UIImageView alloc] init];
    [imageView setImage:[UIImage imageNamed:@"pic.jpg"]];
    [self.view addSubview:scrollView];
    [scrollView addSubview:imageView];

    scrollView.translatesAutoresizingMaskIntoConstraints = NO;
    imageView.translatesAutoresizingMaskIntoConstraints …
Run Code Online (Sandbox Code Playgroud)

zoom uiscrollview ios autolayout

38
推荐指数
2
解决办法
1万
查看次数

Scrollview如何与Autolayout一起使用,以及为什么设置底部垂直空间约束使其工作?

我试图了解UIScrollView在自动布局环境中的工作原理.到目前为止,我已经尝试阅读Apple文档,Stack Overflow研究,Google研究以及研究Matt Neuberg的工作示例.

Apple 6.1文档说:

UIScrollView对象(或简称为滚动视图)的核心概念是它是一个视图,其原点可在内容视图上调整.它将内容剪辑到其框架,该框架通常(但不一定)与应用程序主窗口的内容重合.滚动视图跟踪手指的移动并相应地调整原点.在滚动视图中"显示"其内容的视图基于新原点绘制其自身的一部分,该原点固定在内容视图中的偏移处.除了显示垂直和水平滚动指示器外,滚动视图本身不进行绘制.滚动视图必须知道内容视图的大小,以便它知道何时停止滚动; 默认情况下,当滚动超出内容范围时,它会"反弹".

基于此,让我们来看看应该如何设置约束.

为了便于讨论,假设我们有3个视图作为一般情况 - 默认主视图控制器视图(A),其子视图是UIScrollview(B),UIScrollview有一个子视图是UIView(C) ).假设我们希望(C)高达1000个单位.

因此,我们进入界面构建器,在故事板中选择视图控制器,并在属性检查器选项卡上将大小更改为自由形式.对于视图(A),(B)和(C),我们在尺寸检查器选项卡上将高度更改为1000.

(A)和主窗口之间的约束

是时候设置约束了.文档明确指出"(Scrollview)将内容剪辑到其框架,通常(......)与应用程序主窗口的内容一致".在我们的示例中,(A)将与应用程序主窗口重合,并且不需要对此进行约束.

(A)和(B)之间的约束

现在文档清楚地知道(B)与(A)完全一致,因此我们将在它们之间设置4个约束,引导空间,尾随空间,顶部空间和底部空间以使用0的常量超视图.

(B)和(C)之间的约束

这里的文档不是那么简单.它说(B)的原点可以在(C)上调整,所以(B)肯定应该小于(C).由于我们知道滚动只是上下移动,我们可以将(B)和(C)之间的左右边界限制为零,我们总是希望它在中间,所以我们将添加一个中心x对齐.我们将在它们之间添加3个约束,将空间和尾随空间引导到superview,常量为0,中心x对齐.为了定位视图,我们需要顶部和底部的东西,老实说,我不确定如何根据文档设置这些约束.在模仿Matt Neuberg的例子的基础上,我将它们作为顶级空间进行超级视图,使用常量零和底部空间来监视默认情况下生成的任何常量.这个超视图约束的底部空间是特殊的(显然),从现在开始它将被称为"specialConstraint".

所以呢?!我们通过说(B)肯定小于(C)来开始这一段,并通过设置约束使它们完全相同的大小来结束它.问题1 - 为什么会这样?

(C)自身的约束

我们知道(C)必须大于(B),以便(B)有东西可以滚动,(C)应该根据自己的约束来确定它的大小.很容易,我们设置1个约束,高度= 1000.

specialConstraint

现在我们在视图控制器中为specialConstraint创建一个出口,在viewDidLoad方法中我们设置self.specialConstraint.constant = 0; 这意味着内容视图的底部应该精确地固定在滚动视图的底部,这样就不会向下滚动.但这在Matt Neuberg的例子中有效.问题2 - 这是为什么?

当Scrollview滚动时,真正发生了什么

我认为合乎逻辑的做法是将滚动视图的框架固定,内容视图的原点(或内容偏移)随滚动移动,内容显示滚动视图,就像一个窗口.类似于通过滑动纸张从墙上的孔中查看纸张.

然而,根据我的阅读,scrollview的框架实际上是在移动,就像固定页面上的放大镜一样.

问题3 - 有人可以解释当滚动视图滚动时发生了什么,该对象的帧起源实际上正在改变,为什么这样做?

问题4 - 任何人都可以用简单的英语解释如何在(A),(B)和(C)之间设置约束条件吗?

xcode uiscrollview ios autolayout

11
推荐指数
1
解决办法
4595
查看次数

标签 统计

autolayout ×2

ios ×2

uiscrollview ×2

xcode ×1

zoom ×1