SwiftUI关于菜单 iOS 的长按 & macOS 右键的实现

1,226 阅读2分钟

长按 按钮或者图片出现菜单是个很平常的操作。

从app的icon 到app 内部的按钮 可以将内部的一些操作整合到这个特点内

SwiftUI 自带的菜单选择 ContextMenu

代码

image.png

juejin 的mark down 对于代码不太好用,直接贴图片了。

iOS 效果

macOS

在mac上不是长按了,是右键的菜单操作

文案可能要修改一下,应该叫 右键

这里有一个有趣的点,mac 版本的样式是没有图标。必须加一句

Button(action: { fileData.selectedFilesToOperate = [item] //单个  
                fileWindow.isShowMoveFileView = true })
               { Label("移动", systemImage: "folder") 
               .labelStyle(.titleAndIcon)  
               }

但是现实的情况往往没有如此的简单,至少产品和老板的需求,都不是那么简单。下面几个我自己遇到的情况 可能不太全面,但是按图索骥应该可以给看遇到相似问题的人一点启发的感觉

问题1 菜单 不能太单调,分别来显示

Section {
    Button1
    Button2 ....
} 

用section 包裹 可以让菜单有明显的分区

问题2 菜单里面放点别的

那再放开一点,,contextMenu 内部 放点别的

      contextMenu {
      // picker 
      // list
      // toggle
      // image...
      }

放入单选记得选什么的 Picker

放入子菜单

这里用到了 Menu 这个标签

这个表情 也是个菜单,点击就有,不用长按。

菜单里面放菜单的效果


Menu {

                            Picker(selection: $sort, label: Text("Sorting options")) {

                                Text("Size").tag(0)

                                Text("Date").tag(1)

                                Text("Location").tag(2)

                            }

                        } label: {

                            Label("Sort", systemImage: "arrow.up.arrow.down")

                        }

这个效果挺有意思,和mac 的右键的子菜单一个效果。

这个放一切UI的效果,确实比较有趣。有兴趣可以尝试放入更丰富的控件。

SwiftUI 的控件我个人感觉的套路

  1. 一切view 都是声明的方式,靠@State 或者@Publish 一些的Modify来控制控件的显示数据
  2. 因为没有了生命周期,对于onAppair 和DisAppair的控制放在了每一个控件上的@ViewBuilder上,这个可以自定义,开始的时候都用自带的 @ViewBuilder
  3. View 都是Struct,class用的不多。
  4. View 里面包View,尽量做到了控件复用。而且是挑明了就是,比如之前的Text里面label,Button里面的Label,NavigationLink里面的View(也可以一切不同类型的View)

个人感觉这些都是在表面SwiftUI 打破以前Swift UIKit或者是OC中的UIKit的思维逻辑。

既: UI廉价 刷新廉价

让程序员 特别是iOS 开发过程中,不同状态的刷新UI ,回调刷新UI的开发复杂度

总结

对于一个控件的开始编写,到不停叠加复杂的情况,还有许多场景还没遇到和想到。目前SwiftUI的源码和网上的资料,还不如OC 如此内核的解析资料丰富。但是未来的iOS开发 一定是SwiftUI的时代,特别是对于个人开发者相比OC 友好程度明显。