我正在准备一个GridView,它具有所有方向支持(高度和宽度调整大小)和启用分页。
在我的示例中已经采用了一个3 * 3网格并显示它,就像我在最后一页添加了一些虚拟透明单元格。
问题是,当我在最后一页时,我正在改变我从横向到纵向的方向,分页不起作用。
我在willRotateToInterfaceOrientation
中使用了此代码:
CGPoint scrollTo = CGPointMake(self.frame.size.width * mPageControl.currentPage, 0);
[self setContentOffset:scrollTo animated:YES];
但是当从横向到纵向时,页面仍然移动到最后一页之前的页面,而在将肖像更改为横向时,它可以正常工作。
答案 0 :(得分:4)
出现同样的问题,我的UICollectionView被分页,当我以纵向模式滚动到第2页然后切换到横向时,内容偏移将设置为(72,0),这将持续存在。
控制器已注册进行方向更改,使布局无效,但在那里设置偏移量没有帮助。
做了什么帮助是在布局类'prepareForLayout方法中设置偏移量。我用了
self.collectionView.contentOffset = CGPointMake(小区(self.collectionView.contentOffset.x / self.collectionView.frame.size.width)* self.collectionView.frame.size.width, self.collectionView.contentOffset.y);
使用了天花板,因为地板总是会回到上一页(并且第0页总是分页很好)。
如果您没有使用自定义布局,您仍然可以子类化流程布局并覆盖该功能。
答案 1 :(得分:1)
我设法通过在屏幕方向更改时设置通知并重新加载根据屏幕方向设置项目大小的单元格并为上一个单元格设置索引路径来解决此问题。这也适用于flowlayout。这是我写的代码:
var cellWidthInLandscape: CGFloat = 0 {
didSet {
self.collectionView.reloadData()
}
}
var lastIndex: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
cellWidthInLandscape = UIScreen.main.bounds.size.width
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func rotated() {
// Setting new width on screen orientation change
cellWidthInLandscape = UIScreen.main.bounds.size.width
// Setting collectionView to previous indexpath
collectionView.scrollToItem(at: IndexPath(item: lastIndex, section: 0), at: .right, animated: false)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// Getting last contentOffset to calculate last index of collectionViewCell
lastIndex = Int(scrollView.contentOffset.x / collectionView.bounds.width)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// Setting new width of collectionView Cell
return CGSize(width: cellWidthInLandscape, height: collectionView.bounds.size.height)
}
答案 2 :(得分:0)
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
//Ignoring specific orientations
if (orientation == UIDeviceOrientationFaceUp || orientation == UIDeviceOrientationFaceDown || orientation == UIDeviceOrientationUnknown || currentOrientation == orientation)
{
return;
}
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(relayoutLayers) object:nil];
//Responding only to changes in landscape or portrait
currentOrientation = orientation;
[self performSelector:@selector(handleOrientationChange) withObject:nil afterDelay:0];
然后我会在方向改变时调用方法
-(void)handleOrientationChange
{
CGRect frame = self.frame;
frame.origin.x = self.frame.size.width * mPageControl.currentPage;
frame.origin.y = 0;
[self scrollRectToVisible:frame animated:YES];
}