5

在此处输入图像描述 在此处输入图像描述
我正在准备一个支持所有方向(高度和宽度调整)并启用分页的 GridView。

在我的示例中,我们采用了一个 3*3 网格并显示它,我在最后一页添加了一些虚拟透明单元格。

问题是当我在最后一页并且我将我的方向从横向更改为纵向时,分页不起作用。

我在以下代码中使用了此代码willRotateToInterfaceOrientation

CGPoint scrollTo = CGPointMake(self.frame.size.width * mPageControl.currentPage, 0);
[self setContentOffset:scrollTo animated:YES];

但是,当从横向变为纵向并且将纵向更改为横向时,页面仍然会移动到最后一页之前的页面。

4

3 回答 3

4

有同样的问题,我的 UICollectionView 是分页的,当我以纵向模式滚动到第 2 页然后切换到横向时,内容偏移量将设置为 (72, 0),这将持续存在。

控制器注册了方向更改,它使布局无效,但在那里设置偏移量并没有帮助。

有什么帮助是在布局类的 prepareForLayout 方法中设置偏移量我用了

self.collectionView.contentOffset = CGPointMake(ceil(self.collectionView.contentOffset.x/self.collectionView.frame.size.width)*self.collectionView.frame.size.width, self.collectionView.contentOffset.y);

使用天花板是因为地板总是会回到上一页(并且第 0 页总是分页正常)。

如果您不使用自定义布局,您仍然可以子类化流布局并覆盖该功能。

于 2013-12-10T22:02:48.923 回答
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)

}
于 2018-10-03T06:19:57.377 回答
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];
}
于 2013-10-04T06:21:13.903 回答