iOS:Autolayout导致UIScrollView无法滚动

时间:2013-08-02 00:18:13

标签: ios uiscrollview constraints autolayout

我已经设置了一个UIScrollView,我想在其中展示12个水平布局的图像(只有8个适合屏幕)。在下图中,您可以看到我遇到的问题(这使我的滚动视图无法滚动),我的约束以及我在故事板上添加的UIScrollView

Screenshot of storyboard showing constraints

我在-(void)viewDidLoad上调用了以下方法,其中我“设置”了我的滚动视图(itemList是我的滚动视图属性,itemNames是带有images'names的数组):

- (void)setupHorizontalScrollView
{
    self.itemList.delegate = self;
    [self.itemList setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.itemList setBackgroundColor:[UIColor blackColor]];
    [self.itemList setCanCancelContentTouches:NO];

    self.itemList.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    self.itemList.clipsToBounds = NO;
    self.itemList.scrollEnabled = YES;
    self.itemList.pagingEnabled = NO;

    NSInteger tot=0;
    CGFloat cx = 0;
    for (; ; tot++) {
        if (tot==12) {
            break;
        }

        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[self.itemNames objectAtIndex:tot]]];

        CGRect rect = imageView.frame;
        rect.size.height = 40;
        rect.size.width = 40;
        rect.origin.x = cx;
        rect.origin.y = 0;

        imageView.frame = rect;
        [self.itemList addSubview:imageView];
        cx += imageView.frame.size.width;
    }

    [self.itemList setContentSize:CGSizeMake(cx, [self.itemList bounds].size.height)];
}

我添加了[self.itemList setTranslatesAutoresizingMaskIntoConstraints:NO];因为我在其他帖子上看到了这个建议,但无论有没有它都无效。唯一可行的方法是,如果我取消选中在故事板上使用AutoLayout,但这会移动我使用的UIImageView作为导航栏到屏幕底部。 我不知道该怎么办,感谢任何帮助:)

3 个答案:

答案 0 :(得分:31)

尝试设置scrollView的内容大小int“viewDidLayoutSubviews”方法,同时保持自动布局设置。

-(void)viewDidLayoutSubviews
{
  [self.itemList setContentSize:CGSizeMake(required_width, required_height)];
}

答案 1 :(得分:9)

两种解决方案:

  1. 创建可以同时满足的不同约束(您必须编辑)。我认为问题是你的底层空间和顶级空间限制是相互排斥的。请删除一个,然后再试一次。如果这对您来说很难,请尝试添加另一个UIView以包含UIScrollView以帮助管理您的约束,一开始可能看起来很奇怪,但有时添加另一个视图来包含您的视图实际上会使其更简单每个级别。

  2. 关闭Autolayout,并将UIImageView的自动调整大小屏幕更改为您想要的内容。

答案 2 :(得分:3)

在以下方法中插入:[scrollView setContentSize:CGSizeMake(x,y)];

-(void)viewWillAppear:(BOOL)animated