2014-08-31 7 views
3

Это мой первый раз, используя UIScrollViews с чистым подходом Autolayout. Это то, что иерархия вид выглядитiOS - Pure AutoLayout и UIScrollView не прокручиваются

view 
-scrollview 
--view1 
--view2 
--view3 

Scrollview должен содержать view1 | view2 | view3 в таком порядке.

Я установил ширину прокрутки, высоту, центр и нижнее пространство для наблюдения. Созданные объекты view1, view2 и view3 имеют свои установки ограничений ширины и высоты в методе updateConstraints. Кроме того, некоторые ограничения предоставляются в коде. По какой причине это прокрутка не прокручивается слева направо? Я прочитал буквально все руководства, которые я могу найти в Интернете, о создании и добавлении подпрограмм в UIScrollView программно с автоматическим макетом. Я нашел некоторое упоминание о том, чтобы предоставить четыре разных ограничения: ведущий, конечный, верхний и нижний для каждого представления, добавленного в качестве подсмотра в scrollview. Являются ли эти единственные NSLayoutAttributes, которые можно указать? Как связаны атрибуты, такие как NSLayoutAttribueLeft или NSLayoutAttribueRight? Я также прочитал документацию на сайте Apple, а именно https://developer.apple.com/library/ios/technotes/tn2154/_index.html. У меня есть установка, которую я сейчас имею. Все делается с помощью кода.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.dataSource = @[ [[PCCGenericRating alloc] initWithTitle:@"Easiness" 
                 andMessage:@"WHAT A JOKERRRR" 
                andVariatons:@[ @"very easy", @"easy", @"moderate", @"hard", @"very hard"]], 

         [[PCCGenericRating alloc] initWithTitle:@"Joker" 
                 andMessage:@"WHAT A JOKERRRR" 
                andVariatons:@[ @"very easy", @"easy", @"moderate", @"hard", @"very hard"]], 

         [[PCCGenericRating alloc] initWithTitle:@"Difficulty" 
                 andMessage:@"YOu are not difficult at all" 
                andVariatons:@[ @"very easy", @"easy", @"moderate", @"hard", @"very hard"]] 
         ]; 
    [self initView]; 
} 

- (void)initView { 
    CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height; 
    CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; 

    CGFloat heightDifference = navigationBarHeight + statusBarHeight; 

    self.scrollView = [[UIScrollView alloc] init]; 
    self.scrollView.delegate = self; 
    [self.scrollView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    self.scrollView.backgroundColor = [UIColor greenColor]; 
    [self.view addSubview:self.scrollView]; 


    //setup constraints 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeWidth 
                        relatedBy:NSLayoutRelationEqual 
                         toItem:self.view 
                        attribute:NSLayoutAttributeWidth 
                        multiplier:1.0f 
                        constant:0.0f]]; 

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeHeight 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:self.view 
                  attribute:NSLayoutAttributeHeight 
                 multiplier:1.0f 
                  constant:-heightDifference]]; 

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeCenterX 
                        relatedBy:NSLayoutRelationEqual 
                         toItem:self.view 
                        attribute:NSLayoutAttributeCenterX 
                        multiplier:1.0f 
                        constant:0.0f]]; 

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeBottom 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:self.view 
                  attribute:NSLayoutAttributeBottom 
                 multiplier:1.0f 
                  constant:0.0]]; 

    [self.dataSource enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     PCCGenericRating *rating = (PCCGenericRating *)obj; 
     PCCGenericRatingView *ratingView = [self createViewWithRating:rating]; 
     [self.scrollView addSubview:ratingView]; 

     int multiplier = (idx == 0) ? 1 : (int) (idx + 1) ; 
     [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:ratingView 
                     attribute:NSLayoutAttributeCenterX 
                     relatedBy:NSLayoutRelationEqual 
                      toItem:self.scrollView 
                     attribute:NSLayoutAttributeCenterX 
                     multiplier:multiplier 
                     constant:0.0f]]; 

     [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:ratingView 
                    attribute:NSLayoutAttributeCenterY 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.scrollView 
                    attribute:NSLayoutAttributeCenterY 
                    multiplier:1.0f 
                    constant:0.0f]]; 
    }]; 
} 

- (PCCGenericRatingView *)createViewWithRating:(PCCGenericRating *)rating { 
    PCCGenericRatingView *view = [PCCGenericRatingView genericRatingViewWithTitle:rating.title andMessage:rating.message]; 
    return view; 
} 

При печати из ограничений Scrollview, они выглядят хорошо мне:

po self.scrollView.constraints 
<__NSArrayM 0x115b051f0>(
<NSLayoutConstraint:0x1145d9290 PCCGenericRatingView:0x114579880.centerX == UIScrollView:0x11458d4b0.centerX>, 
<NSLayoutConstraint:0x1145d9410 PCCGenericRatingView:0x114579880.centerY == UIScrollView:0x11458d4b0.centerY>, 
<NSLayoutConstraint:0x1145d9dd0 PCCGenericRatingView:0x1145d9560.centerX == 2*UIScrollView:0x11458d4b0.centerX>, 
<NSLayoutConstraint:0x1145d9e40 PCCGenericRatingView:0x1145d9560.centerY == UIScrollView:0x11458d4b0.centerY>, 
<NSLayoutConstraint:0x1145da6b0 PCCGenericRatingView:0x1145d9e90.centerX == 3*UIScrollView:0x11458d4b0.centerX>, 
<NSLayoutConstraint:0x1145da730 PCCGenericRatingView:0x1145d9e90.centerY == UIScrollView:0x11458d4b0.centerY> 
) 

Вот скриншот того, что он выглядит следующим образом: simulator

Я нахожу это странным, что последний элемент в источнике данных - это первый контроллер представлений, отображающийся в scrollview, когда он должен быть последним. Он также не прокручивается влево-вправо, как следует.

+0

Попробуйте вызвать initView из viewWillAppear, так как все размеры вашего макета не установлены в viewDidLoad. –

+0

Это ничего не меняет. Я считаю, что есть некоторые ограничения, которые не добавляются. Я просто не знаю, что. – kamran619

ответ

3

Где бы вы ни печатали свои ограничения, попробуйте распечатать scrollview.contentSize, это, вероятно, будет 0,0, и именно там ваша проблема. Насколько я знаю, и, как вы упомянули в своем сообщении, вы должны явно установить subviews scrollview в верхние нижние левые и правые ограничения scrollviews. При этом они автоматически устанавливают contentSize прокрутки, которые позволят ей прокручивать. Похоже, вы только устанавливаете ограничения центра X и centerY, которые не будут устанавливать scrollviews contentSize для того, что вам нужно.

Попробуйте установить эти программно (это псевдокод, но вы получите идею):

  • view1.topConstraint = scrollView.topConstraint
  • view1.leftConstraint = scrollView.leftConstraint
  • view3.bottomConstraint = Scrollview .bottomConstraint
  • view3.rightConstraint = scrollView.rightConstraint

Если вы установите все это правильно, ваше прокрутка будет прокручиваться правильно. Просто не забудьте проверить содержимое, а если содержимое составляет 0,0, ваши ограничения не будут правильно настроены.

4

Убедитесь, что ваш top_constraint для view1 и bottom_constraint для View3 будет в соответствии с вашими ограничений Scrollview в. В противном случае scrollview's contentSize: {0, 0}.

+0

Я думаю, что это самое важное! Благодаря :) – Shardul

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