2015-03-14 4 views
0

Просто играйте с авто-макетом и UIScrollView. Что мне здесь не хватает? Это отображает синий scrollView в нижней части экрана, но я не вижу контент. Отладчик просмотра также не имеет права говорить об этом. Есть идеи?Автоматическая компоновка + UIScrollView и однострочный просмотр

// 
// ViewController.m 
// Fit 
// 
// Created by Adam Dahan on 2015-03-13. 
// Copyright (c) 2015 Adam Dahan. All rights reserved. 
// 

#import "ViewController.h" 

@interface ViewController() 
{ 
    UIScrollView *scrollView; 
    UIView *contentView; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self createViews]; 
    [self constrainScrollView]; 
    [self constrainContentView]; 
} 

- (void)createViews 
{ 
#pragma Initialize a scrollView 
    scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; 
    scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
    scrollView.backgroundColor = [UIColor blueColor]; 
    scrollView.showsHorizontalScrollIndicator = NO; 
    scrollView.showsVerticalScrollIndicator = NO; 
    [self.view addSubview:scrollView]; 

#pragma Initialize a contentView for the scrollView 
    contentView = [[UIView alloc] initWithFrame:CGRectZero]; 
    contentView.backgroundColor = [UIColor redColor]; 
    contentView.translatesAutoresizingMaskIntoConstraints = NO; 
    [scrollView addSubview:contentView]; 
} 

- (void)constrainScrollView 
{ 

#pragma scrollView vertical constraints 
    NSArray *cns = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[scrollView(40)]|" 
                 options:0 
                 metrics:nil 
                   views:NSDictionaryOfVariableBindings(scrollView)]; 
    [self.view addConstraints:cns]; 

#pragma scrollView horizontal constraints 
    cns = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" 
               options:0 
               metrics:nil 
               views:NSDictionaryOfVariableBindings(scrollView)]; 
    [self.view addConstraints:cns]; 
} 

- (void)constrainContentView 
{ 

#pragma contentView vertical constraints 
    NSArray *cns = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" 
               options:0 
               metrics:nil 
               views:NSDictionaryOfVariableBindings(scrollView, contentView)]; 
    [scrollView addConstraints:cns]; 

#pragma contentView horizontal constraints 
    cns = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" 
               options:0 
               metrics:nil 
               views:NSDictionaryOfVariableBindings(scrollView, contentView)]; 
    [scrollView addConstraints:cns]; 
} 

@end 
+0

Мне кажется, вам нужно установить размер содержимого: 'scrollView.contentSize ='. Обычно вы используете ограничения на scrollView, но не на своем представлении содержимого. Вы устанавливаете размер содержимого scrollView, и он обрабатывает остальные. –

ответ

1

ScrollViews немного сложнее при использовании автоматической компоновки. Кадр определяется из ограничений с другими представлениями (так как вы будете добавлять в метод constainScrollView).

Но contentSize определяется в зависимости от ограничений, связанных с видами внутри scrollView. Для вашего случая contentSize равен (0,0), потому что внутренний вид не имеет ограничений по ширине или высоте.

Полагаю, вы хотите, чтобы этот внутренний вид заполнил прокрутку. Тогда ваши ограничения должны выглядеть следующим образом:

- (void)constrainContentView 
{ 
    [self.view layoutIfNeeded]; // This causes the scrollview width and height to be calculated based on the constraints you sent in the previous method 
    // You could check by adding a breakpoint here, if the scrollview has the frame you would expect 

#pragma contentView vertical constraints 
    NSArray *cns = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[contentView(height)]-|" 
               options:0 
               metrics:@{"height":@(CGRectGetHeight(scrollView.frame))} 
               views:NSDictionaryOfVariableBindings(scrollView, contentView)]; 
    [scrollView addConstraints:cns]; 

#pragma contentView horizontal constraints 
    cns = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" 
               options:0 
               metrics:@{"width":@(CGRectGetWidth(self.view.frame))} 
               views:NSDictionaryOfVariableBindings(scrollView, contentView)]; 
    [scrollView addConstraints:cns]; 
} 

Фактическое значение вы установили для width и height зависит от ваших потребностей.

Важно, чтобы представления внутри scrollView нуждались в ограничениях таким образом, чтобы установить contentSize без двусмысленности. Это означает, что если представление не имеет собственного размера (например, UIButton или UILabel), вам необходимо явно добавить ограничения ширины/высоты.

Из-за установки ширины и высоты в явном виде при изменении ориентации вам необходимо будет обновить ограничения, чтобы представления внутри имели правильные размеры.

Надеюсь, что эта проблема решена.

+0

Спасибо за ваш ответ :) Я думаю, что меня смутил VFL, потому что из моего понимания H: | - [view] - | (pipe-view-pipe) означает ширину супервизора. Поэтому я бы подумал, что естественно расширит всю ширину экрана. – arcognito

+0

Добро пожаловать :) Да, поэтому автоматическая компоновка немного сложна, когда дело доходит до 'scrollViews', потому что они делают разницу между ограничениями, которые используются для определения их' frame', и те, которые используются для определения 'contentSize'. Нельзя ожидать, что они будут разными. В любом случае, отлично, что вы исправили свою проблему –

1

Вы действительно должны зарегистрироваться Technical Note TN2154 UIScrollView And Autolayout.

Ваш путь позволяет системе не решить scrollView contentSize.

Основная идея - позволить scrollView знать, что такое contentSize, независимо от того, каким способом вы выберете.

+0

Тогда для чего требуется contentSize для работы? – arcognito

+1

@arcognito фактически система будет вычислять contentSize для вас, если вы используете Auto Layout с ScrollView. Поэтому ему нужны ограничения, которые могут рассчитать правильный размер. – Puttin

Смежные вопросы