2013-03-14 118 views
3

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

使用故事板,我有一个TabBarViewController,其中一个选项卡有一个UIScrollView和Page Control。

在幕后我用编程方式设置了UIView中页面的处理方式(我不知道是否需要发布代码,但为了清晰起见,我仍然会这么做)。

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

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

4英寸屏幕 4 Inch Screen

3.5英寸屏幕 3.5 Inch Screen

以防万一,这里是我的.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 

回答

5

enter image description here

使用这样

enter image description here

你这样的问题会解决

或在您的.m文件

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

我做这两个页面控制和UIScrollVie写瓦特,这并没有奏效。我错过了什么吗? – Macness 2013-03-14 05:35:59

+0

为滚动视图和页面控件执行此操作的方法与您的相同 – Pratik 2013-03-14 05:37:22

+0

结果相同。我设置了滚动视图,就像你的两个例子一样,我只在页面控件的底部进行了自动调整(我只是希望它保持在标签栏的顶部,没有运气。: – Macness 2013-03-14 05:39:33

4

写一行代码就检查您已添加滚动视图的视图已启用AutoResizeSubviews。如果不是,则不会根据屏幕大小调整滚动视图。其次,根据3.5英寸的屏幕调整您的滚动视图,自动调整大小将调整为4英寸的屏幕。反之亦然。

对于页面控制,请这样做。它始终处于你的观点的底部。

+0

这不适合我。我必须使用CGRectMake以编程方式设置滚动视图和页面控件,并找到顶层视图的高度来移动它们。 – Macness 2013-03-14 07:14:32

+1

“只需检查添加了滚动视图的视图是否启用了AutoResizeSubviews”。这是我的问题。 – 2013-05-13 08:58:21

1

在支持文件夹选择yourappname.pch,并在文件 检查底部的最后#ENDIF前添加此行,对设备....

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

然后在viewWillAppear中()

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