簡體   English   中英

iOS Objective C ScrollView

[英]iOS Objective C ScrollView

在此處輸入圖片說明 我正在嘗試實現UIScrollView並使用Objective-C從Xcode中的圖像數組中加載圖像,UIScrollView中的每個圖像在縱向和橫向模式下都必須全屏顯示。我已經能夠使其工作在縱向模式下,但不在橫向模式下。 所有iOS設備尺寸均應為全屏顯示。 以下是我到目前為止編寫的代碼。 我的情節提要中有UIScrollView,一個按鈕和一個標簽。 任何答案或指向實現此目的的教程將不勝感激。 提前致謝。

CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat widthInPixel = screen.size.width;
CGFloat heightInPixel = screen.size.height;
float increaseAmount = widthInPixel;
self.imageScrollView.contentMode = UIViewContentModeScaleAspectFit;
self.imageScrollView.pagingEnabled = YES;
[self.imageScrollView setAlwaysBounceVertical:NO];
[self.imageScrollView setAlwaysBounceHorizontal:NO];
imageViews = [[NSMutableArray alloc] init];
self.imageScrollView.clipsToBounds = YES;
NSInteger imageNumbers  = [self.images count];
UIImageView *image;
for(NSInteger i = 0; i < imageNumbers; i++) {
    CGFloat xOrigin = i * self.view.frame.size.width;
    image = [[UIImageView alloc] initWithFrame:
                          CGRectMake(xOrigin, 0,
                                     widthInPixel,

    self.imageScrollView.frame.size.height)];



    image.contentMode = UIViewContentModeScaleAspectFit;
    image.clipsToBounds = YES;
    image.image = self.images[i];

    [image setAutoresizingMask:
     UIViewAutoresizingFlexibleWidth |
     UIViewAutoresizingFlexibleHeight];

    [self.imageScrollView addSubview:image];
}

self.imageScrollView.contentSize = CGSizeMake(image.frame.size.width *
                                         imageNumbers,

self.imageScrollView.frame.size.height);

您確實應該學習如何使用自動布局和約束。 使用您喜歡的搜索引擎並搜索ios auto layout tutorial ...,您會發現很多材料。


編輯:

在啟用分頁的情況下旋轉滾動視圖時,滾動偏移是一個固有的問題。 有關viewWillTransitionToSize的實現,請參見下面的編輯。


但是,給您一個想法,這會做您想要的,包括在設備旋轉時自動調整大小:

//
//  ViewController.m
//  ScrollingImages
//
//  Created by Don Mag on 7/19/18.
//

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) IBOutlet UIScrollView *theScrollView;

@end

@implementation ViewController

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

    NSArray *images = @[@"a", @"b", @"c", @"d", @"e"];

    [_theScrollView setPagingEnabled:YES];
    [_theScrollView setAlwaysBounceVertical:NO];
    [_theScrollView setAlwaysBounceHorizontal:NO];

    // we'll use this to hold the most recently added view
    UIImageView *prevImageView = nil;

    for (int i = 0; i < images.count; i++) {

        // create an image view with named image from array
        UIImageView *v = [[UIImageView alloc] initWithImage:[UIImage imageNamed:images[i]]];

        // we want to use auto-layout
        v.translatesAutoresizingMaskIntoConstraints = NO;

        // we want aspect-fit
        v.contentMode = UIViewContentModeScaleAspectFit;

        // add it to the scroll view
        [_theScrollView addSubview:v];

        // set width and height constraints equal to the scroll view
        [[NSLayoutConstraint
          constraintWithItem:v
          attribute:NSLayoutAttributeWidth
          relatedBy:NSLayoutRelationEqual
          toItem:_theScrollView
          attribute:NSLayoutAttributeWidth
          multiplier:1.0
          constant:0.0] setActive:YES];

        [[NSLayoutConstraint
          constraintWithItem:v
          attribute:NSLayoutAttributeHeight
          relatedBy:NSLayoutRelationEqual
          toItem:_theScrollView
          attribute:NSLayoutAttributeHeight
          multiplier:1.0
          constant:0.0] setActive:YES];

        if (i == 0) {  // if it's the first image

            // add top constraint
            [[NSLayoutConstraint
              constraintWithItem:v
              attribute:NSLayoutAttributeTop
              relatedBy:NSLayoutRelationEqual
              toItem:_theScrollView
              attribute:NSLayoutAttributeTop
              multiplier:1.0
              constant:0.0] setActive:YES];

            // and leading constraint
            [[NSLayoutConstraint
              constraintWithItem:v
              attribute:NSLayoutAttributeLeading
              relatedBy:NSLayoutRelationEqual
              toItem:_theScrollView
              attribute:NSLayoutAttributeLeading
              multiplier:1.0
              constant:0.0] setActive:YES];

        } else {

            // constrain leading to previous image view trailing
            [[NSLayoutConstraint
              constraintWithItem:v
              attribute:NSLayoutAttributeLeading
              relatedBy:NSLayoutRelationEqual
              toItem:prevImageView
              attribute:NSLayoutAttributeTrailing
              multiplier:1.0
              constant:0.0] setActive:YES];

            // and top to previous image view top
            [[NSLayoutConstraint
              constraintWithItem:v
              attribute:NSLayoutAttributeTop
              relatedBy:NSLayoutRelationEqual
              toItem:prevImageView
              attribute:NSLayoutAttributeTop
              multiplier:1.0
              constant:0.0] setActive:YES];

        }

        if (i == images.count - 1) {  // if it's the last image

            // add trailing constraint
            [[NSLayoutConstraint
              constraintWithItem:v
              attribute:NSLayoutAttributeTrailing
              relatedBy:NSLayoutRelationEqual
              toItem:_theScrollView
              attribute:NSLayoutAttributeTrailing
              multiplier:1.0
              constant:0.0] setActive:YES];

            // and bottom constraint
            [[NSLayoutConstraint
              constraintWithItem:v
              attribute:NSLayoutAttributeBottom
              relatedBy:NSLayoutRelationEqual
              toItem:_theScrollView
              attribute:NSLayoutAttributeBottom
              multiplier:1.0
              constant:0.0] setActive:YES];

        }

        // reference to most recently added view
        prevImageView = v;

    }

}

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // execute before rotation

    // get the "index" of the current image in the scroll view
    NSUInteger idx = (unsigned)(_theScrollView.contentOffset.x / _theScrollView.frame.size.width);

    [coordinator animateAlongsideTransition:^(id  _Nonnull context) {
        // execute during rotation

        // update the scroll view's contentOffset, based on the "index"
        self.theScrollView.contentOffset = CGPointMake(idx * self.theScrollView.frame.size.width, 0);

    } completion:^(id  _Nonnull context) {
        // execute after rotation (if additional code wanted)
    }];

}
@end

您可以在此處下載一個有效的示例項目: https : //github.com/DonMag/ScrollingImages

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM