编辑代码

实操遇到的问题,

1,某个参数值的范围是 0-1,是个比例值,但是你填2230等它不会报错,转换为1是什么效果你懂的
2,再次调用某视图时,错误提示,未使用该视图,原因未知,暂时解决办法是赋一个变量等于视图
3TapGestur中如果你写了onchanged代码,错误提示没有遵从equalable协议,网上查说点击时这个状态为空
4,offset和rotation修改器的顺序很重要,否则显示的不是你要的结果
5,目前还在解决的问题,在200 * 200的frame里面画一个圆,但是frame内圆区域外可接受事件
一开始以为是frame矩形范围内都可响应,后面发现只是周边响应,又以为是ISO默认的手指头的点击范围
慢着,好像真有ISO默认手指头范围这回事
现在发现,mask、clipshape 只会影响视图,看不见区域仍可响应事件,offset更扯,原位置仍可响应事件
面临两个选择,一个是功能方法替换,找一个能实现功能的平替
另一个是重新寻找绘制方法

toai,
nf.video/bj3tjn ,需Gmail注册,囧,但手机号和微信可登录,怀疑为钓鱼网站。不管它了,小佛系已登录

设置scale为circle的一个属性,当点击时更改scale的倍数,然后生成视图时调用scaleEffect(circle.scale)方法,
结果锚点总在屏幕中间,导致圆向某个方向伸缩而不是由中心向四周均匀收缩,即使增加一个参数.center也不行,
最后迫使使用frame里面长宽 半径*2*scale 的方法才正常。
更正:
.scaleEffect(circle.scale, anchor: .center)
.position(circle.position)
没想到position会影响scaleEffect,position若放在前面,它的border是几乎全屏的矩形区域,
那么里面的circle缩放不是以自己的中心,而是以大矩形的中心。

报错No exact matches in reference to static method 'buildExpression'
网解:这个报错都是因为在SwiftUIViewBody里面使用了ForEach循环,却没有在ForEach循环闭包的内部返回视图,
而是做了一个对数据集合进行修改的操作,所以才报错.
 SwiftUI中的ForEach是一个视图构建器,用于根据提供的数据集合创建视图。ForEach应仅用于常量数据。
 这意味着,如果数据集合是不可变的,即在创建后不会发生变化,那么可以使用嵌套ForEach来创建视图。
解决方案:
在ForEach循环内部只需要返回遵循View协议的视图就好,如果需要对数据集合中某个某个数据的某个属性进行修改,修改后能更新视图,
可以使用For in 循环来做或者将修改操作放到某个点击事件的闭包里或者是某个UI更新的回调闭包里去修改.

在 Swift 中,结构体的实例是值类型,当你定义一个结构体 CircleData 的实例并将其放入数组时,每个实例都是不可变的(使用 let 来定义)。
这意味着你不能直接修改 circle 的属性(例如 radius)因为其是一个常量。
解决办法:
circles = circles.map { circle in
                    // 根据条件更新每个 CircleData 的 radius
                    var updatedCircle = circle
                    let newRadius = sqrt(pow(circle.radius, 2) + pow(12, 2))
                    updatedCircle.radius = newRadius
                    return updatedCircle
                }
//注意,这个是针对每一个元素,若要对具体的某一个元素,需要增加判断条件

longpress 的onEnded修饰符在达到minimumDuration时间时触发,闭包内返回一个bool类型的参数。
这是一个坑,我希望按住圆的时候圆变大到一定大小,然后手指松开的时候,圆恢复原状。 但是往往还没松手圆就自动调用回原状,
也即是,只要到达onchanged中定的minimumDuration时间,就立即调用了onEnded中代码,等不到松手。

struct CircleData {var radius: Double}
var circleData: CircleData? = nil
for i in 1...5 {
    if i % 2 == 0 {
        circleData = CircleData(radius: Double(i))
    }
    print("Circle radius: \(circleData!.radius)") // 若为 nil,此处将崩溃
}
在这个示例中,circleData 可能是 nil,在尝试使用 circleData!.radius 时将导致崩溃。
可改为
for i in 1...5 {
    if i % 2 == 0 {
        circleData = CircleData(radius: Double(i))
    } else {
        circleData = nil // 这里可以赋值为 nil 以便进行下一次循环
    }

    if let data = circleData {
        print("Circle radius: \(data.radius)")
    } else {
        print("No circle data")
    }
}
呜呜呜,看来可选不是那么好用的

今天把网上这段代码let distance = hypot(value.location.x - circle.position.x, value.location.y - circle.position.y)
复制到程序中时,报了3条错误,分别是Cannot convert value of type 'Binding<Subject>' to expected argument type 'CGFloat'Referencing subscript 'subscript(dynamicMember:)' requires wrapper 'Binding<CircleData>',
Value of type 'CircleData' has no dynamic member 'position' using key path from root type 'CircleData'
百思不得其解,后面AI提醒,会不会是CircleData中的position写成了positon,仔细一看,还真是的,白忙活了一上午

背景图上有个圆,在背景图上添加了一个dragGesture,当我一开始手指就在圆上然后再拖动的时候,dragGesture没有执行,
用了同时执行和优先执行都不行。 解决办法是添加一个透明的矩形

在onChanged中不断for in遍历circles,分不清逻辑时,在草稿纸上写出两个for in,下面跟着判断条件,想象
一个for in结束之后立即进入第二个for in,看看哪些变量又被重新赋值了

两个逻辑打架:一些全局变量,想到图逻辑清晰省事,把它们统一放在class个体的onEnded中去处理。
然而,直到有些全局做的逻辑出现了混乱,才明白应该直接放在全局的onEnded去处理。

func inImageOnchange(pos: CGPoint){
    for circle in circles {
        let distance = hypot(pos.x - circle.position.x, pos.y - circle.position.y)
        if distance < circle.radius {
            followSize = 12
            hasFollow = false  // 隐藏跟随圆
            break
        } else {
            hasFollow = true
        }
这段简短的代码为什么起用?一个一个circle的状态单独地分析,才发现break是其中的关键。

学到了几点优化性能的办法:1let tempD = sqrt(distanceX * distanceX + distanceY * distanceY)
优于let tempD = sqrt(pow(circle2.position.y - circle.position.y, 2) + pow(circle2.position.x - circle.position.x, 2))
2,一个数学计算若要用于某个if条件之内,那就把数学计算放在if条件内,而不要提前计算

数组中多个圆,需要AB blend,结果显示总是大于AB的总和,查原因才发现,算了一遍AB,也算了一遍BA。
结果是A上面加了:BAB。

在View里面总是不能用print,解决办法:加一个 .onAppear{
                        print("Creating dandelion \(index)")
                    }

let rotation: Double
if distanceFromCenter < 0.5 * radius {
    rotation = 0 // Center area, no rotation
} else if xPos < 0 {
    rotation = 45 * (1 - (distanceFromCenter / maxDistance)) // Left inclined
} else {
    rotation = -45 * (1 - (distanceFromCenter / maxDistance)) // Right inclined
}会报错,下面的却不会
 let rotation: Double = distanceFromCenter < maxDistance / 2 ? 0 : (xPos < 0 ? 45 : -45)

今天不知道怎么啦,多处出错,感觉就像老天不让我写这个程序似的。1,网络的方法几经修改,XCode的预览始终显示不出想要的效果,30View,一开始就零零星星的显示几个,print坐标却是正常的;
2,foreach以前用起来好好的,今天只要一读取元素index的值,就报错,报一些毫无头绪的错,注释掉就好了;3,以前用overlay挺正常的,今天不管放哪个位置,就是出现在目标位置,始终就在屏幕的最中间;
4,还有border(.black)以前用得好好的,今天也是无论放哪个位置,View外面就始终没有一圈黑线。 感觉以前的忠臣今天全体叛逃! 

通过加载3张图片的方式实现动画效果,发现总是一闪一闪的,周期时间消失,开始以为是文件名没输对,仔细检查了是对的。
再者是怀疑是因为每次都重加载导致,还是不行。 实在无招,然后把assert里面的文件名复制到代码中,一切OK,囧

ObservableObject写成了ObservedObject, 报错而不自知

在 SwiftUI 中,确实是使用 @ObservedObject 或 @StateObject 来观察一个遵循 ObservableObject 协议的类的实例。
当这个类的属性发生变化时,相关的视图会自动更新。然而,要让这种自动更新机制生效,属性必须被标记为 @Published。

这几天搞崩溃了,一个Bug怎么改都不行,一个视图在屏幕上移动,当移动到目标点时,又重新设置目标点,
这么简单的逻辑,但是总是位置打印是连贯的,预览以及上机都是一样的,都出现闪跳现象,即突然间出现在远处的
某个地方,而不是自己预想的走哪都是一步步走到的,并且视图的朝向也总是错的。

一个视图拖动到最下面的状态栏下,即使已经使用了 .navigationBarHidden(true),还是看不见,搜索了半天,
最后才发现,没有在拖动对象下运用:.ignoresSafeArea(),只在背景图片用了,造成了背景已有就不需的错误认知。囧囧