我想在轮播更改期间手动更新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?
答案 0 :(得分:12)
将我的评论转换为答案:)
尝试改为contentOffset
内的willAnimateRotationToInterfaceOrientation:duration:
。到那时,动画块应该就位,操作系统会将您对contentOffset的更改视为属于旋转引起的更改。
如果之前更改了contentOffset,系统似乎不会将这些更改视为属于旋转,并且仍然会应用旋转调整大小,这次是从新维度开始。
答案 1 :(得分:4)
在UIScrollView上启用分页并保持页面偏移时,以下代码段可以解决问题。
声明一个属性,它将在旋转前计算currentPage的位置,并在viewDidLoad
@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];
}