【发布时间】:2020-02-26 05:06:22
【问题描述】:
一个视图与另一个视图相交。我们如何在 SwiftUI 中检测到这个交叉点?
在 Swift 中,我只需几行代码即可实现:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let a = UIView(frame: CGRect(x: 100, y: 100, width: 150, height: 150))
a.backgroundColor = .purple
view.addSubview(a)
let b = UIView(frame: CGRect(x: 150, y: 150, width: 150, height: 150))
b.backgroundColor = .orange
view.addSubview(b)
if a.frame.intersects(b.frame) {
print("yes!")
} else {
print("no intersection!")
}
}
}
显然,它与 SwiftUI 无关:我们这里有另一个框架概念。什么可以代替?有人有想法吗?
更新:
非常感谢user3441734 和Asperi 的帮助和建议! 这是我使用矩形数组解决问题的尝试:
import SwiftUI
struct ContentView: View {
@State var rect = CGRect()
@State var aRects = [CGRect]()
var body: some View {
VStack {
ZStack {
Rectangle()
.frame(width: 150, height: 300)
.foregroundColor(.purple)
.background(self.rectReader(self.$rect))
HStack {
Spacer()
Spacer()
Spacer()
Rectangle()
.frame(width: 150, height: 180)
.foregroundColor(.pink)
.background(self.rectReader(self.$rect))
Spacer()
}
}
Button(action: {
//print("aRects: \(self.aRects)")
self.checkIntersection()
}){
Text("Check Intersection!")
}
}
}
// fill array of rects here
func rectReader(_ binding: Binding<CGRect>) -> some View {
return GeometryReader { (geometry) -> AnyView in
let rect = geometry.frame(in: .global)
DispatchQueue.main.async {
binding.wrappedValue = rect
print("rect: \(self.rect)")
self.aRects.append(self.rect)
}
return AnyView(Rectangle().fill(Color.clear))
}
}
func checkIntersection() {
if aRects.count == 2 {
if self.aRects[0].intersects(self.aRects[1]) {
print("yes!")
} else {
print("no!")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
【问题讨论】:
-
很多。你有什么尝试吗?至少this?
-
我读了很多关于几何阅读器等的东西,但还没有找到一个简单的方法来做到这一点。对不起;如果我的问题看起来很愚蠢。
-
@Asperi 请看我的回答 :-) 尤其是最后一部分。
标签: view swiftui frame intersection