0

ページングを有効にしてUIScrollViewを使用しようとしています。私は様々なUIViewをUISCrollViewにサブビューとして追加しています。それらのサブビューをスクロールビューのサイズよりも小さくしたいので、それに応じて制約を変更しました。今私は実際に左右にスワイプすると、中央に来ることはありません。私はそれが、現在のページが中央にあるサイドからの前後のビューを見ることを期待していました。水平ページング付きUIScrollViewはサブビューを中心にしません

これは、それ以下は enter image description here

のように見えるものでは高く評価任意のポインタ/コメント/フィードバック私のコードのscrollviewの実装

// 
    // ViewController.m 
    // Paging 
    // 

#import "ViewController.h" 

@interface ViewController() 
@property (nonatomic, strong) UIScrollView *pagingScrollView; 
@end 

@implementation ViewController 
- (UIScrollView *)pagingScrollView { 
    if (!_pagingScrollView) { 
     _pagingScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; 
     _pagingScrollView.translatesAutoresizingMaskIntoConstraints = NO; 
     _pagingScrollView.backgroundColor = [UIColor orangeColor]; 
     _pagingScrollView.showsHorizontalScrollIndicator = NO; 
     _pagingScrollView.showsVerticalScrollIndicator = NO; 
     _pagingScrollView.contentInset = UIEdgeInsetsZero; 
     _pagingScrollView.pagingEnabled = YES; 
     _pagingScrollView.clipsToBounds = NO; 
     _pagingScrollView.bounces = NO; 
    } 
    return _pagingScrollView; 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self scrollViewSetUp]; 

    NSDictionary *views = NSDictionaryOfVariableBindings(_pagingScrollView); 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_pagingScrollView]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_pagingScrollView]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 
} 

- (void)scrollViewSetUp { 

    [self.view addSubview:self.pagingScrollView]; 

    UIView *lastView = nil; 
    NSInteger arrayCount = 5; 

    for(NSInteger index = 0; index < arrayCount; index++) 
    { 
     UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; 
     view.translatesAutoresizingMaskIntoConstraints = NO; 
     view.backgroundColor = [UIColor yellowColor]; 

     [self.pagingScrollView addSubview:view]; 

     [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                     attribute:NSLayoutAttributeTop 
                     relatedBy:NSLayoutRelationEqual 
                      toItem:self.pagingScrollView 
                     attribute:NSLayoutAttributeTop 
                     multiplier:1 
                     constant:40]]; 

     [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                     attribute:NSLayoutAttributeHeight 
                     relatedBy:NSLayoutRelationEqual 
                      toItem:self.pagingScrollView 
                     attribute:NSLayoutAttributeHeight 
                     multiplier:0.80 
                     constant:0]]; 

     [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                     attribute:NSLayoutAttributeWidth 
                     relatedBy:NSLayoutRelationEqual 
                      toItem:self.pagingScrollView 
                     attribute:NSLayoutAttributeWidth 
                     multiplier:0.80 
                     constant:0]]; 

     if (lastView == nil && index == 0){ 
      [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view(==_pagingScrollView)]" 
                         options:0 
                         metrics:nil 
                          views:@{@"view":view, @"_pagingScrollView":_pagingScrollView}]]; 
     } else { 
      [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[lastView]-20-[view]" 
                         options:0 
                         metrics:nil 
                          views:@{@"lastView":lastView, @"view":view, @"_pagingScrollView":_pagingScrollView}]]; 
     } 

     if(index == arrayCount-1) { 
      [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view]-20-|" 
                         options:0 
                         metrics:nil 
                          views:@{@"view":view}]]; 
     } 

     lastView = view; 
    } 
} 
@end 

です。ありがとう。

+0

がなかった場合は、このされており、変更-20 -40に、サブビューのマージンを変更します代わりにこのライブラリを試してみませんか? https://github.com/nicklockwood/SwipeView –

答えて

0

もちろん、そうではありません。 pagingScrollViewのサブビューに正しい幅がありません!また、これらのサブビューは正しい水平マージンを持っていません。

  1. 最初に設定幅コードを修正し、乗数を1に変更し、定数を-40に変更する必要があります。このように:?

    [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                       attribute:NSLayoutAttributeWidth 
                       relatedBy:NSLayoutRelationEqual 
                        toItem:self.pagingScrollView 
                       attribute:NSLayoutAttributeWidth 
                       multiplier:1 
                       constant:-40]]; 
    
  2. 次に、この

    [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[lastView]-40-[view]" 
                           options:0 
                           metrics:nil 
                            views:@{@"lastView":lastView, @"view":view, @"_pagingScrollView":_pagingScrollView}]]; 
    
+0

スーパービュー(この場合はscrollview)よりもサイズが小さいので、乗数は0.80です – slonkar

0

ようにあなたが enter image description here

// 
// ViewController.h 
// Test 
// 
// Created by Lee on 7/8/16. 
// Copyright © 2016 Lee. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property (nonatomic, strong) UIScrollView *pagingScrollView; 

@end 



// 
// ViewController.m 
// Test 
// 
// Created by Lee on 7/8/16. 
// Copyright © 2016 Lee. All rights reserved. 
// 

#import "ViewController.h" 

@interface ViewController()<UIScrollViewDelegate> 
@property (nonatomic,strong)NSMutableArray *subviewsCenterArray; 

@end 

@implementation ViewController 

- (UIScrollView *)pagingScrollView { 
    if (!_pagingScrollView) { 
     _pagingScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; 
     _pagingScrollView.translatesAutoresizingMaskIntoConstraints = NO; 
     _pagingScrollView.backgroundColor = [UIColor orangeColor]; 
     _pagingScrollView.showsHorizontalScrollIndicator = NO; 
     _pagingScrollView.showsVerticalScrollIndicator = NO; 
     _pagingScrollView.contentInset = UIEdgeInsetsZero; 
     _pagingScrollView.pagingEnabled = NO; 
     _pagingScrollView.clipsToBounds = NO; 
     _pagingScrollView.bounces = NO; 
     _pagingScrollView.delegate = self; 
    } 
    return _pagingScrollView; 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self scrollViewSetUp]; 

    NSDictionary *views = NSDictionaryOfVariableBindings(_pagingScrollView); 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_pagingScrollView]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_pagingScrollView]|" 
                     options:0 
                     metrics:nil 
                     views:views]]; 
} 

- (void)scrollViewSetUp { 

    [self.view addSubview:self.pagingScrollView]; 

    UIView *lastView = nil; 
    NSInteger arrayCount = 5; 
    _subviewsCenterArray = [NSMutableArray array]; 
    for(NSInteger index = 0; index < arrayCount; index++) 
    { 
     UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; 
     view.translatesAutoresizingMaskIntoConstraints = NO; 
     view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1]; 
     view.tag = 9999; 
     view.layer.cornerRadius = 6; 
     [self.pagingScrollView addSubview:view]; 

     [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                      attribute:NSLayoutAttributeTop 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:self.pagingScrollView 
                      attribute:NSLayoutAttributeTop 
                     multiplier:1 
                      constant:40]]; 

     [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                      attribute:NSLayoutAttributeHeight 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:self.pagingScrollView 
                      attribute:NSLayoutAttributeHeight 
                     multiplier:0.80 
                      constant:0]]; 

     [self.pagingScrollView addConstraint:[NSLayoutConstraint constraintWithItem:view 
                      attribute:NSLayoutAttributeWidth 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:self.pagingScrollView 
                      attribute:NSLayoutAttributeWidth 
                     multiplier:0.80 
                      constant:0]]; 

     if (lastView == nil && index == 0){ 
      [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view(==_pagingScrollView)]" 
                          options:0 
                          metrics:nil 
                          views:@{@"view":view, @"_pagingScrollView":_pagingScrollView}]]; 
     } else { 
      [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[lastView]-20-[view]" 
                          options:0 
                          metrics:nil 
                          views:@{@"lastView":lastView, @"view":view, @"_pagingScrollView":_pagingScrollView}]]; 
     } 

     if(index == arrayCount-1) { 
      [self.pagingScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view]-20-|" 
                          options:0 
                          metrics:nil 
                          views:@{@"view":view}]]; 
     } 

     [self.view layoutIfNeeded]; 




     lastView = view; 
    } 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 

    [self changeTheCardStatus:scrollView]; 

} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    [self changeTheCardStatus:scrollView]; 

} 


-(void)changeTheCardStatus:(UIScrollView *)scrollView{ 

    for (UIView *view in scrollView.subviews) { 
     if (view.tag == 9999) { 
      [_subviewsCenterArray addObject:@(view.center.x)]; 
     } 

    } 



    CGFloat currentCenterOffsetX = scrollView.contentOffset.x + CGRectGetWidth(self.view.frame)/2.0; 

    NSMutableArray *absoluteValueArray = [NSMutableArray array]; 
    NSMutableDictionary *absoluteValueDictionary = [NSMutableDictionary dictionary]; 
    for (int i = 0; i < _subviewsCenterArray.count; i ++) { 
     float subviewsCenterPointX = [_subviewsCenterArray[i] floatValue]; 
     double absolute = fabs(subviewsCenterPointX - currentCenterOffsetX); 
     [absoluteValueArray addObject:@(absolute)]; 
     [absoluteValueDictionary setValue:@(subviewsCenterPointX) forKey:[NSString stringWithFormat:@"%f",absolute]]; 
    } 


    [absoluteValueArray sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { 

     double a = [obj1 doubleValue]; 
     double b = [obj2 doubleValue]; 
     if (a>b) { 
      return NSOrderedDescending; 
     } 
     else if (a<b){ 
      return NSOrderedAscending; 
     } 
     else{ 
      return NSOrderedSame; 
     } 

    }]; 


    double shortValue = [absoluteValueArray.firstObject doubleValue]; 
    double centerX = [[absoluteValueDictionary objectForKey:[NSString stringWithFormat:@"%f",shortValue]] doubleValue]; 
    [UIView animateWithDuration:0.25 animations:^{ 
     scrollView.contentOffset = CGPointMake(centerX - CGRectGetWidth(self.view.frame)/2.0, 0); 

    }]; 

} 



- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
関連する問題