旋转期间UIScrollView的contentOffset

时间:2010-09-05 19:55:16

标签: iphone ipad uiscrollview rotation

我想在轮播更改期间手动更新contentOffset的{​​{1}}。滚动视图填充屏幕,具有灵活的宽度和灵活的高度。

我目前正在尝试更新UIScrollView中的contentOffset,如下所示:

willRotateToInterfaceOrientation

然而,最终值不是修改后的值,它似乎受到它的影响,但对我来说并不明显。

这些是我得到的一些结果:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [Utils logPoint:myScrollView.contentOffset tag:@"initial"];
    myScrollView.contentOffset = CGPointMake(modifiedX, modifiedY);
    [Utils logPoint:myScrollView.contentOffset tag:@"modified"];
}

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [Utils logPoint:myScrollView.contentOffset tag:@"final"];
}

如何在轮换期间更新滚动视图的contentOffset?

3 个答案:

答案 0 :(得分:12)

将我的评论转换为答案:)

尝试改为contentOffset内的willAnimateRotationToInterfaceOrientation:duration:。到那时,动画块应该就位,操作系统会将您对contentOffset的更改视为属于旋转引起的更改。

如果之前更改了contentOffset,系统似乎不会将这些更改视为属于旋转,并且仍然会应用旋转调整大小,这次是从新维度开始。

答案 1 :(得分:4)

在UIScrollView上启用分页并保持页面偏移时,以下代码段可以解决问题。

声明一个属性,它将在旋转前计算currentPage的位置,并在viewDidLoad

中将其设置为-1
@property (assign, nonatomic) NSInteger lastPageBeforeRotate;

然后覆盖willRotateToInterfaceOrientation:toInterfaceOrientation:duration方法并为其分配计算值。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    int pageWidth = self.scrollView.contentSize.width / self.images.count;
    int scrolledX = self.scrollView.contentOffset.x;
    self.lastPageBeforeRotate = 0;

    if (pageWidth > 0) {
        self.lastPageBeforeRotate = scrolledX / pageWidth;
    }

    [self showBackButton:NO];
}

然后我们确保在执行旋转之前,我们正确设置了scrollview的内容偏移量,以便将其集中到我们的lastPageBeforeRotate

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
        if (self.lastPageBeforeRotate != -1) {
            self.scrollView.contentOffset = CGPointMake(self.scrollView.bounds.size.width * self.lastPageBeforeRotate, 0);
            self.lastPageBeforeRotate = -1;
        }
}

答案 2 :(得分:3)

更新了iOS 8 +的答案

在你的控制器中实现viewWillTransitionToSize:withTransitionCoordinator:

示例:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    NSUInteger visiblePage = (NSInteger) self.scrollView.contentOffset.x / self.scrollView.bounds.size.width;

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
        self.scrollView.contentOffset = CGPointMake(visiblePage * self.scrollView.bounds.size.width, self.scrollView.contentOffset.y);
    } completion:nil];
}