我已经创建了一个UICollectionView,这样我就可以将视图排列成整齐的列.我希望在> 500像素宽的设备上有一个列.
为了实现这一点,我创建了这个函数:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let size = collectionView.frame.width
if (size > 500) {
return CGSize(width: (size/2) - 8, height: (size/2) - 8)
}
return CGSize(width: size, height: size)
}
Run Code Online (Sandbox Code Playgroud)
这在第一次加载时按预期工作,但是当我旋转设备时,计算并不总是再次发生,并且视图并不总是按预期重绘.这是设备旋转时的代码:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
collectionView.collectionViewLayout.invalidateLayout()
self.view.setNeedsDisplay()
}
Run Code Online (Sandbox Code Playgroud)
我假设我忘了重绘一些东西,但我不确定是什么.任何想法都非常感谢收到!
我有一个照片库视图,使用a UICollectionView,a UICollectionViewFlowLayout,pagingEnabled水平滚动,一次只显示一个视图.
工作得很好,直到我试图旋转它...
当我旋转设备时,在willRotateToInterfaceOrientation:duration:我更新它collectionView.contentOffset所以它保持在正确的项目上,我调整currentCell的大小,以便它动画到新的尺寸. 问题出在两个状态之间的动画中,"前一个"方向从左上角开始动画,并在其他单元格中查看. 什么是我做错了,因为在屏幕上制作动画的视图是FUBAR?
这是它在行动中的样子:
http://www.smugmug.com/gallery/n-3F9kD/i-BwzRzRf/A(忽略不稳定的视频,那就是Quicktime的错:p)
这是我的willAnimateRotationToInterfaceOrientation:duration:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
// Update the flowLayout's size to the new orientation's size
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
flow.itemSize = CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height);
} else {
flow.itemSize = CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height);
}
self.collectionView.collectionViewLayout = flow;
[self.collectionView.collectionViewLayout invalidateLayout];
// Get the currently visible cell
PreviewCellView *currentCell = (PreviewCellView*)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForRow:_currentIndex inSection:0]]; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用a实现照片库UICollectionView.设置类似于本教程中的设置:单元格与集合视图一样大,因此您一次只能看到一张图片.分页已启用,因此您可以逐个图片滚动浏览图库.到目前为止一切正常.
当设备旋转到横向时,我还想保留该设置.它在细胞/图像大小方面工作得很好.但是就像在前面提到的教程中描述的那样,集合视图被旋转到两个图片之间的某个奇怪位置.
我的目标是让集合视图在旋转之后显示与旋转之前显示的相同的单元格.就像在这篇文章中一样.
我试图解决这个问题:
在旋转之前,我将indexpath当前可见项目保存到属性,如下所示:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
NSArray *visibleItems = [self.galleryCollectionView indexPathsForVisibleItems];
self.currentIndexPath = [visibleItems lastObject];
[self.galleryCollectionView.collectionViewLayout invalidateLayout];
}
Run Code Online (Sandbox Code Playgroud)
在旋转之后,我尝试滚动到该项目,如下所示:
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self.galleryCollectionView scrollToItemAtIndexPath:self.currentIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只适用于集合中的前两个项目,如果我滚动到让第五个项目旋转并将设备旋转到一些奇怪的中间单元格位置.
我有什么想法我做错了吗?
我有一个分页,水平滚动UICollectionView,每个单元格占用视图/设备屏幕的大小,一次出现一个单元格.我遇到一个问题,在设备旋转时,单元格将转换为正确的新大小,但单元格的位置将关闭.
轮换前:
轮换后:
在旋转时,我怎样才能不仅正确调整集合视图单元格的大小,还要确保当前单元格保持可见?
我把这个问题简化为一个非常简单的例子,没有自定义流布局.
将单元格的大小设置为collectionView框架的大小(集合视图是持有它的视图控制器的大小):
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return collectionView.frame.size
}
Run Code Online (Sandbox Code Playgroud)
试图处理轮换viewWillLayoutSubviews:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }
flowLayout.itemSize = collectionView.frame.size
flowLayout.invalidateLayout()
}
Run Code Online (Sandbox Code Playgroud)
其实,如果我叫invalidateLayout()的viewWillLayoutSubviews,设置itemSize在这里不应该是必要的,因为sizeForItemAtIndexPath布局之后,重新将被调用.
在设置新的itemSize之后,我还尝试在旋转期间手动滚动到第一个可见单元格,但这显示没有改进:
if let item = collectionView.indexPathsForVisibleItems().first {
collectionView.scrollToItemAtIndexPath(item, atScrollPosition: .CenteredHorizontally, animated: true)
}
Run Code Online (Sandbox Code Playgroud)