xcode UIScrollView 不会自动调整大小

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15401848/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 02:58:30  来源:igfitidea点击:

UIScrollView will not resize with autosizing

iosxcodeuiscrollviewautosize

提问by Macness

Everything I've read on supporting UIScrollView on iOS 5+ states that I should be able to use the autosizing feature within Xcode's Size Inspector to auto resize my views.

我读到的关于在 iOS 5+ 上支持 UIScrollView 的所有内容都表明我应该能够使用 Xcode 的 Size Inspector 中的自动调整大小功能来自动调整我的视图大小。

Using Storyboards, I have a TabBarViewController of which one of my tabs has a UIScrollView and a Page Control.

使用 Storyboards,我有一个 TabBarViewController,其中一个选项卡有一个 UIScrollView 和一个页面控件。

Behind the scenes I have setup programmatically a handling of the pages in a UIView (I don't know if it's necessary to post the code, but I'm going to do it anyway for clarity).

在幕后,我以编程方式设置了 UIView 中页面的处理(我不知道是否有必要发布代码,但为了清楚起见,我还是会这样做)。

When switching from the iPhone 3.5inch to the iPhone 4inch the auto resize is not working whatsoever. I'd like to have the UIScrollView AND the Page control visible when using the 3.5 inch screen.

从 iPhone 3.5 英寸切换到 iPhone 4 英寸时,自动调整大小不起作用。我希望在使用 3.5 英寸屏幕时可以看到 UIScrollView 和页面控件。

I should note that the iPad version (see code below) doesn't snap properly in my subview. (That may be a different question, altogether).

我应该注意到 iPad 版本(见下面的代码)在我的子视图中没有正确捕捉。(这可能是一个不同的问题,完全)。

4 Inch Screen4 Inch Screen

4寸屏4寸屏

3.5 Inch Screen3.5 Inch Screen

3.5寸屏3.5寸屏

Just in case, here's my .m file:

以防万一,这是我的 .m 文件:

#import "TutorialViewController.h"

@interface TutorialViewController ()
@property (nonatomic, strong) NSArray *pageImages;
@property (nonatomic, strong) NSMutableArray *pageViews;

- (void)loadVisiblePages;
- (void)loadPage:(NSInteger)page;
- (void)purgePage:(NSInteger)page;

#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD() (false)
#endif


@end

@implementation TutorialViewController

@synthesize scrollView = _scrollView;
@synthesize pageControl = _pageControl;

@synthesize pageImages = _pageImages;
@synthesize pageViews = _pageViews;



- (void)loadPage:(NSInteger)page {
    if (page < 0 || page >= self.pageImages.count) {
        // If it's outside the range of what you have to display, then do nothing
        return;
    }

    // 1
    UIView *pageView = [self.pageViews objectAtIndex:page];
    if ((NSNull*)pageView == [NSNull null]) {
        // 2
        CGRect frame = self.scrollView.bounds;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0.0f;

        // 3
        UIImageView *newPageView = [[UIImageView alloc] initWithImage:[self.pageImages objectAtIndex:page]];
        newPageView.contentMode = UIViewContentModeScaleAspectFill;
        newPageView.frame = frame;
        [self.scrollView addSubview:newPageView];
        // 4
        [self.pageViews replaceObjectAtIndex:page withObject:newPageView];
    }
}

- (void)purgePage:(NSInteger)page {
    if (page < 0 || page >= self.pageImages.count) {
        // If it's outside the range of what you have to display, then do nothing
        return;
    }

    // Remove a page from the scroll view and reset the container array
    UIView *pageView = [self.pageViews objectAtIndex:page];
    if ((NSNull*)pageView != [NSNull null]) {
        [pageView removeFromSuperview];
        [self.pageViews replaceObjectAtIndex:page withObject:[NSNull null]];
    }
}

- (void)loadVisiblePages {
    // First, determine which page is currently visible
    CGFloat pageWidth = self.scrollView.frame.size.width;
    NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x * 2.0f + pageWidth) / (pageWidth * 2.0f));

    // Update the page control
    self.pageControl.currentPage = page;

    // Work out which pages you want to load
    NSInteger firstPage = page - 1;
    NSInteger lastPage = page + 1;


    // Purge anything before the first page
    for (NSInteger i=0; i<firstPage; i++) {
        [self purgePage:i];
    }

    // Load pages in our range
    for (NSInteger i=firstPage; i<=lastPage; i++) {
        [self loadPage:i];
    }

    // Purge anything after the last page
    for (NSInteger i=lastPage+1; i<self.pageImages.count; i++) {
        [self purgePage:i];
    }

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Load the pages that are now on screen
    [self loadVisiblePages];
    // NSLog(@"Scroll View Did Scroll");
}


- (void)viewDidLoad {
    [super viewDidLoad];

    // Step 1
    if (IS_IPAD())
    {
        self.pageImages = [NSArray arrayWithObjects:
                           [UIImage imageNamed:@"1536x2048 tutorial_1.png"],
                           [UIImage imageNamed:@"1536x2048 tutorial_2.png"],
                           [UIImage imageNamed:@"1536x2048 tutorial_3.png"],
                           [UIImage imageNamed:@"1536x2048 tutorial_4.png"],
                           nil];
    }
    else
    {
        self.pageImages = [NSArray arrayWithObjects:
                           [UIImage imageNamed:@"640x960 tutorial_1.png"],
                           [UIImage imageNamed:@"640x960 tutorial_2.png"],
                           [UIImage imageNamed:@"640x960 tutorial_3.png"],
                           [UIImage imageNamed:@"640x960 tutorial_4.png"],
                           nil];
    }


    NSInteger pageCount = self.pageImages.count;

    // Step 2
    self.pageControl.currentPage = 0;
    self.pageControl.numberOfPages = pageCount;

    // Step 3
    self.pageViews = [[NSMutableArray alloc] init];
    for (NSInteger i = 0; i < pageCount; ++i) {
        [self.pageViews addObject:[NSNull null]];
    }
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // Step 4
    // 3.5in height = 388
    // 4in height = 476
    CGSize pagesScrollViewSize = self.scrollView.frame.size;
    self.scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * self.pageImages.count, pagesScrollViewSize.height);

    // Step 5
    [self loadVisiblePages];
}

@end

回答by Pratik

enter image description here

在此处输入图片说明

use like this

像这样使用

or

或者

enter image description here

在此处输入图片说明

like this your problem will solve

像这样你的问题会解决

or write single line code in your .m file

或在您的 .m 文件中编写单行代码

 scrollview.frame = CGRectMake(x, y, 320, self.view.bounds.size.height);

回答by Swati

Just check if the view in which you have added the scroll view has enabled AutoResizeSubviews. If not it will not adjust the scrollview according to the screen size.

只需检查您添加滚动视图的视图是否启用了 AutoResizeSubviews。如果不是,它不会根据屏幕大小调整滚动视图。

Secondly, adjust your scroll view according to 3.5 inch screen and AutoResizing will adjust it for 4 inch screen. Don't do it vice-versa.

其次,根据 3.5 英寸屏幕调整滚动视图,AutoResizing 会将其调整为 4 英寸屏幕。不要反其道而行之。

For page control, Do it this way. It will always be at the bottom of your view.

对于页面控制,这样做。它始终位于您视图的底部。

回答by Ravi

select yourappname.pch in the Supporting Files folder and add this line right before the last #endif at the bottom of the file to Check, for device....

在 Supporting Files 文件夹中选择 yourappname.pch 并在文件底部的最后一个 #endif 之前添加这一行以检查设备...。

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)

then write this in your ViewWillAppear()

然后在你的 ViewWillAppear() 中写下这个

    if (IS_IPHONE5)
    {
        scrollView.contentSize = CGSizeMake(width,height );
    }