我正在迅速工作,我正在尝试使用.frames检查2个CGRect类型的对象是否相交。我有一个View Controller类和一个CircleClass,CircleClass创建了一个具有手势识别功能的圆,因此我可以将自己创建的圆拖到想要的位置,现在我想添加一个选项,如果在拖移子视图的末尾与我的trashimageView相交(对于像垃圾箱一样的所有设备,图像视图始终位于视图的右下角),它可以删除圆圈或subView。
问题是,当我尝试在视图控制器中创建的函数“ deleteSubView”中调用trashImageView.frame时,显示为nil并且我的应用程序崩溃。
但是如果IBOutlet在VC中并且我的函数在VC中定义,我也可以在viewDidLoad中调用trashImageView.frame(CGRect值),这很好,但是在我的函数中没有,为什么我得到nil对于这个值??
class ViewController: UIViewController {
@IBOutlet var trashImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
//here i can print the CGRect value just fine
print("my imageView init: \(trashImageView.frame)")
}
func deleteSubView(subView: UIView){
// Here i get nil from the trashImageView.frame
if (subView.frame.intersects(trashImageView.frame)) {
print("intersection")
subView.removeFromSuperview()
}
}
}
我检查了Nil值是否来自'trashImageView.frame',并且与情节提要的连接良好。
我从另一个类中将函数称为“删除subView”,但这应该重要吗?我不明白这里的错误是什么,为什么我得到零?请帮助。
因为您的UIViewController
被声明,并且使用情节提要instantiated”,我的猜测是您正在使用没有arg初始化程序的视图控制器来创建视图,即:let controller = MyController()
(如果必须以编程方式创建该控制器的实例)通过获取对包含控制器的情节提要的引用,即像这样:
NOTE:在这里,我使用“ MyController”作为类的名称以及在情节提要中设置的标识符。
func createMyController() -> MyController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "MyController")
return controller as! MyController
}
我还将在您的deleteSubview(:subView)
方法中添加视图加载状态的保护措施,如下所示:
func deleteSubView(subView: UIView) {
guard isViewLoaded else { return }
// Here i get nil from the trashImageView.frame
if (subView.frame.intersects(trashImageView.frame)) {
print("intersection")
subView.removeFromSuperview()
}
}