2014-10-03 2 views
0

Ниже приведен мой код для App Tour с использованием UIScrollView с поддержкой пейджинга с использованием AutoLayout (Masonry). Он отлично работает в портрете, но когда я поворачиваю пейджинг, он отключается, поэтому он не работает в Landscape. Тогда он не работает и в портретном режиме. Может кто-то помочь, что здесь не так?UIScrollView пейджинг отключен после поворота

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor clearColor]; 

    self.scrollView = [UIScrollView new]; 
    self.scrollView.backgroundColor = [UIColor clearColor]; 
    self.scrollView.scrollEnabled = YES; 
    self.scrollView.pagingEnabled = YES; 
    self.scrollView.delegate = self; 
    self.scrollView.showsHorizontalScrollIndicator = NO; 
    [self.view addSubview:self.scrollView]; 

    [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.edges.equalTo(self.view); 
    }]; 

    UIImageView *esImageview1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CommonResources.bundle/page1"]]; 
    esImageview1.contentMode = UIViewContentModeScaleAspectFit; 
    esImageview1.backgroundColor = [UIColor clearColor]; 
    esImageview1.userInteractionEnabled = YES; 
    [self.scrollView addSubview:esImageview1]; 

    [esImageview1 mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.top.bottom.equalTo(self.scrollView); 
     make.width.height.equalTo(self.view); 
    }]; 

    UIImageView *esImageview2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CommonResources.bundle/page2"]]; 
    esImageview2.contentMode = UIViewContentModeScaleAspectFit; 
    esImageview2.backgroundColor = [UIColor clearColor]; 
    esImageview2.userInteractionEnabled = YES; 
    [self.scrollView addSubview:esImageview2]; 

    [esImageview2 mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.equalTo(esImageview1.mas_right); 
     make.top.bottom.equalTo(self.scrollView); 
     make.width.height.equalTo(self.view); 
    }]; 

    UIImageView *esImageview3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CommonResources.bundle/page3"]]; 
    esImageview3.contentMode = UIViewContentModeScaleAspectFit; 
    esImageview3.backgroundColor = [UIColor clearColor]; 
    esImageview3.userInteractionEnabled = YES; 
    [self.scrollView addSubview:esImageview3]; 

    [esImageview3 mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.equalTo(esImageview2.mas_right); 
     make.top.bottom.equalTo(self.scrollView); 
     make.width.height.equalTo(self.view); 
    }]; 

    self.pageControl = [UIPageControl new]; 
    self.pageControl.numberOfPages = 3; 
    self.pageControl.currentPage = 0; 
    self.pageControl.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:self.pageControl]; 

    [self.pageControl mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.right.equalTo(self.view); 
     make.height.equalTo(@40); 
     make.top.equalTo(self.view).with.offset(40); 
    }]; 

    UILabel *titleLabel = [UILabel new]; 
    titleLabel.text = @"App Tour"; 
    titleLabel.backgroundColor = [UIColor clearColor]; 
    titleLabel.textColor = [UIColor whiteColor]; 
    titleLabel.font = [UIFont fontWithName:@"Helvetica-Light" size:16]; 
    titleLabel.textAlignment = NSTextAlignmentCenter; 
    [self.view addSubview:titleLabel]; 

    [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.left.right.equalTo(self.view); 
     make.height.equalTo(@40); 
     make.top.equalTo(self.view).with.offset(20); 
    }]; 

    UIButton *doneButton = [UIButton new]; 
    [doneButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Light" size:16]]; 
    [doneButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    [doneButton setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted]; 
    [doneButton setTitle:@"Done" forState:UIControlStateNormal]; 
    [doneButton addTarget:self action:@selector(doneButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    doneButton.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:doneButton]; 

    [doneButton mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.right.equalTo(self.view); 
     make.height.equalTo(@40); 
     make.width.equalTo(@70); 
     make.top.equalTo(self.view).with.offset(20); 
    }]; 
} 

- (void)doneButtonPressed:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width*self.pageControl.numberOfPages, self.view.frame.size.height); 
} 

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
    CGFloat pageWidth = self.scrollView.frame.size.width; 
    int page = floor((self.scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 
    self.pageControl.currentPage = page; 
} 

Scrollview after rotation

ответ

0

Я просто хотел сбросить contentsize Scrollview в в didRotateFromInterfaceOrientation делегата. Не знаю, почему, хотя, поскольку, когда я вращаюсь, videDidLayoutSubview уже получает вызов, где я уже переписываю размер контента.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width*self.pageControl.numberOfPages, self.view.frame.size.height); 
} 
0

Я предполагаю, что его получение прикрыто другим видом или что-то подобное этому. Попробуйте подклассифицировать UIScrollView и реализовать следующий метод, чтобы проверить, не реагирует ли он на ваши прикосновения.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"OMG TOUCHES WORK, NOW WHAT?"); 
} 

Вы можете легко проверить, было ли оно закрыто, заставляя его находиться впереди. Вызовите эту строку кода в обратном вызове для вращения в UIViewController, содержащем UIScrollView. Это должно решить проблему. Возможно, вам придется подклассифицировать UIView для контроллера и вместо этого применить этот метод в методе didLayoutSubviews, не совсем уверен, зависит от вашей реализации.

[self.view bringSubViewToFront:self.scrollView]; 

Также проверьте рамку и оценки до и после поворота и посмотреть, если что-то неуместны глядя

+0

Я проверил, что ничего не покрывает scrollview. Наверху у меня есть изображения на страницы. Очень странно, когда я поворачиваю scrollview, автоматически прокручивается на первую страницу, а затем останавливает пейджинг и никогда не возвращается. – applefreak

+0

Есть ли какой-нибудь шанс? Top imageview теряет свойство взаимодействия? Я добавил изображение после поворота - обратите внимание, что у меня есть изображение внутри scrollview сверху, которое ожидается. – applefreak

+0

Нельзя допустить, чтобы я потерял свойство enabled. Пробовали ли вы подклассы и применяли метод touchs. Потому что это вам многое скажет. Также очень приятная новая функция, которую мне нравится (если вы используете xCode 6, который вам нужен), новая функция «Просмотр отладки». Вы можете прочитать об этом здесь, https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html – anders

Смежные вопросы