swift 如何创建像iPhone主屏幕启动视图的页面?

vcudknz3  于 6个月前  发布在  Swift
关注(0)|答案(2)|浏览(73)

如果我想实现iPhone类型的图标管理,大小图标都可以拖动和删除,我应该怎么做?
我试过使用UICollectionview,但似乎没有达到预期的效果。因为这些图标大小不一,应该用什么布局?当大图标向小图标移动时,如何计算周围的小图标,并将四个小图标的位置与大图标交换?

e5njpo68

e5njpo681#

您可以通过UICollectionview实现图标管理,具体操作如下:

1.使用UICollectionview显示图标。
1.由于图标的大小不同,因此可以使用UICollectionviewFlowLayout来排列图标。UICollectionviewFlowLayout使您可以在网格布局中对齐图标。
1.当一个大图标移向小图标时,需要计算周围的小图标并交换它们的位置。实现UICollectionviewDelegate的collectionView(_:moveItemAt:to:)方法来交换大图标和小图标的位置。更新显示以反映更改后的图标排列。
1.要实现拖拽删除功能,需要开启UICollectionview的dragInteractionEnabled属性,并实现collectionView(_:itemsForBeginning:at:)方法,指定可以拖拽删除的图标,指定好要拖拽删除的图标后,再对拖拽的图标进行相应的删除处理。
通过遵循上述步骤,您可以使用UICollectionview实现图标管理。

v2g6jxz6

v2g6jxz62#

您可以通过使用UICollectionView来实现您的目标。但是,Compositional Layout可能更容易使用(而不是流布局)因为它不需要你提供视图中每个图标的确切大小。你可以提供估计值。你可能也会发现this library很有用,因为它进一步简化了组合布局的实现。你可以通过创建一个枚举来使用这个库,并定义像这样的例子:

import UIKit
import Composure

enum LayoutSections: Int, CaseIterable, DefinesCompositionalLayout {
    //list the number of sections in your layout. in this example 
    //there are 2 sections with different layout requirements.
    case section1
    case section2
    
    func layoutInfo(using layoutEnvironment: NSCollectionLayoutEnvironment) -> CompositionalLayoutOption {
        switch self {
        case .section1:
            return .fixedWidthDynamicHeight(fixedWidth: 180, estimatedHeight: 75)
        case .section2:
            return .dynamicWidthDynamicHeight(estimatedWidth: 150, estimatedHeight: 150)
        }
    }
}

字符串
然后在集合视图所在的视图控制器中,您将生成如下布局:

import UIKit
import Composure

class MyViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //...
        //generate the compositional layout with one line of code
        collectionView.collectionViewLayout = generateCompositionalLayout(with: LayoutSections.allCases)
    }
}


如果要对集合视图中的项进行重新排序,则数据源必须实现collectionView(_:moveItemAt:to:)。如文档所述,如果不实现此方法,则无法对集合视图中的项进行重新排序。
最后,如果你想在集合视图中支持拖放效果,你必须实现UICollectionViewDragDelegate协议中指定的函数。

相关问题