问题描述
我正在开发一个基于地图的应用程序,用户可以选择地图注释,然后UIView必须与数据库中的照片一起出现,但是我按注释没有任何反应
这是代码
import UIKit
import MapKit
import CoreLocation
import Firebase
import FirebaseStorage
class MapViewController: UIViewController,CLLocationManagerDelegate {
@IBOutlet weak var MapButton: UITabBarItem!
@IBOutlet weak var mapView: MKMapView!
> Here is the UIView that must appear after user selected an annotation
@IBOutlet var addView: UIView!
@IBOutlet weak var URLImageView: UIImageView!
override func viewDidLoad() {
addView.layer.cornerRadius = 5
}
func animateIn() {
self.view.addSubview(addView)
addView.center = self.view.center
addView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
addView.alpha = 0
UIView.animate(withDuration: 0.3) {
self.addView.alpha = 1
self.addView.transform = CGAffineTransform.identity
}
}
func animateOut() {
UIView.animate(withDuration: 0.3) {
self.addView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
self.addView.alpha = 0
} completion: { (success:Bool) in
self.addView.removeFromSuperview()
}
}
这是当用户选择注释时激活方法的方法。它在数据库中查找图像并将其检索,我尝试使用一个简单的UIInageView并使其工作出色,它检索了该图像并将其放入图像视图,但是我需要对其进行自定义,因此我创建了一个必须出现的自定义UIView当用户按下注释时
func mapView(_ mapView: MKMapView,didSelect view: MKAnnotationView) {
var coord = self.selectedAnnotation
coord = view.annotation as? MKPointAnnotation
let codeLat = coord?.coordinate.latitude
let codeLon = coord?.coordinate.longitude
animateIn()
let db = Firestore.firestore()
db.collection("locations").getDocuments() { [self] (querySnapshot,err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
if let coords = document.get("pinLocation") {
let point = coords as! GeoPoint
let lat = point.latitude
let lon = point.longitude
if codeLat == lat && codeLon == lon {
let imageUrl = document.data()["url"]
print(imageUrl!)
let er = "not found"
let url = URL(string: "\(imageUrl ?? er)")!
dispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
dispatchQueue.main.async {
self.ecoURLImageView.image = UIImage(data: data)
URLImageView.layer.cornerRadius = 10
URLImageView.clipsToBounds = true
URLImageView.layer.borderColor = UIColor.systemGreen.cgColor
URLImageView.layer.borderWidth = 3
}
}
}
}
}
}
}
}
}
解决方法
您似乎没有为视图设置框架。
尝试
self.myView.frame = CGRect(X:0,y:0,width:100,height:100)
self.view.addSubview(myView)
,
如果已在Storyboard中添加了UI元素,则 不 希望将其重新添加到视图层次结构或从视图层次结构中删除。
尝试这样:
class MapViewController: UIViewController,CLLocationManagerDelegate {
@IBOutlet weak var MapButton: UITabBarItem!
@IBOutlet weak var mapView: MKMapView!
// > Here is the UIView that must appear after user selected an annotation
@IBOutlet var addView: UIView!
@IBOutlet weak var URLImageView: UIImageView!
override func viewDidLoad() {
addView.layer.cornerRadius = 5
// hide addView on load
self.addView.isHidden = true
}
func animateIn() {
// un-hide addView
self.addView.isHidden = false
// it's already in the view hierarchy - so don't add it!!!
//self.addView.removeFromSuperview()
//self.view.addSubview(addView)
addView.center = self.view.center
addView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
addView.alpha = 0
UIView.animate(withDuration: 0.3) {
self.addView.alpha = 1
self.addView.transform = CGAffineTransform.identity
}
}
func animateOut() {
UIView.animate(withDuration: 0.3) {
self.addView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
self.addView.alpha = 0
} completion: { (success:Bool) in
// hide addView
self.addView.isHidden = true
// don't remove it from superview
//self.addView.removeFromSuperview()
}
}
}