2014-10-03 68 views
0

以下是我使用UIScrollView使用AutoLayout启用分页的App Tour代码(Masonry)它在Portrait中正常工作,但当我旋转分页时被禁用,因此它在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

我只是想重置滚动型在didRotateFromInterfaceOrientation委托contentsize。不知道为什么,因为当我旋转时,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?"); 
} 

你可以很容易地检查它是否被强迫它置​​于前面。在包含UIScrollView的UIViewController中,在回调中调用这行代码。它应该解决问题。您可能必须继承控制器的UIView,并将此方法放在didLayoutSubviews方法中,而不是十分确定,取决于您的实现。

[self.view bringSubViewToFront:self.scrollView]; 

旋转前后还要检查框架和边界,看看是否发现任何异常的地方寻找

+0

我检查过没有任何内容是覆盖scrollview。在最上面,我有每页图像。当我旋转scrollview自动滚动到第一页,然后停止分页并且永不回头时,这是非常奇怪的。 – applefreak 2014-10-03 22:33:39

+0

有没有机会顶级imageview失去交互启用属性?我在旋转后添加了图像 - 注意到我在顶部的scrollview中有一个imageview,这是预期的。 – applefreak 2014-10-03 22:40:38

+0

它不应该在我的知识中失去启用的属性。你有没有尝试子类化和实现触摸方法。因为这会告诉你很多。另外一个非常好的新功能我喜欢(如果您使用xCode 6,您应该)新的“查看调试”功能。你可以在这里阅读更多, https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html – anders 2014-10-06 15:43:23