2013-03-14 2 views
3

Все, что я прочитал о поддержке UIScrollView на iOS 5+, указывает, что я должен использовать функцию авторазбора в XSode Size Inspector для автоматического изменения размеров моих представлений.UIScrollView не будет изменять размер с помощью авторазмера

С помощью раскадровки у меня есть TabBarViewController, у которого одна из моих вкладок имеет UIScrollView и элемент управления страницей.

За кулисами У меня есть программная настройка страниц в UIView (я не знаю, нужно ли размещать код, но я все равно сделаю это для ясности).

При переключении с iPhone 3.5inch на iPhone 4inch автоматический размер не работает вообще. Я бы хотел, чтобы интерфейс UIScrollView AND the Page был видимым при использовании 3,5-дюймового экрана.

Следует отметить, что версия 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 w и это не сработало.Я что-то упускаю? – Macness

+0

сделайте это для просмотра прокрутки и для управления страницей, как у вас есть – Pratik

+0

То же самое. Я настраиваю вид прокрутки, как оба ваших примера, и у меня есть авторизация ТОЛЬКО для нижней части элемента управления страницы (я просто хочу, чтобы он оставался сверху панели вкладок. Нет Luck. :( – Macness

4

Просто проверьте, если вид, в который вы добавили прокрутку, включил AutoResizeSubviews. Если нет, он не будет настраивать прокрутку в соответствии с размером экрана.

Во-вторых, отрегулируйте вид прокрутки в соответствии с 3,5-дюймовым экраном, и AutoResizing отрегулирует его для 4-дюймового экрана. Не делайте этого наоборот.

Для управления страницей сделайте это так. Он всегда будет внизу вашего представления.

+0

Это не сработало для меня. Мне пришлось настроить программный просмотр прокрутки и управление страницей с помощью CGRectMake и найти высоту представления верхнего уровня для их перемещения. – Macness

+1

«Просто проверьте, включено ли представление, в которое вы добавили прокрутку, AutoResizeSubviews». Это была моя проблема. –

1

выберите yourappname.pch в опорном папке Files и добавьте эту строку прямо перед последним #endif в нижней части файла Чтобы проверить, для устройства ....

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

затем записать это в ViewWillAppear()

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