我是swift的新手,我有这段代码,UIViewController
和UITextField
是UIButton
:
import Foundation
import UIKit
class ManualTagController: UIViewController, UIGestureRecognizerDelegate, UITextFieldDelegate {
let addTagButton = UIButton()
let tagTextfield = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
self.view.layer.cornerRadius = self.view.frame.width/80
self.addTagButton.setTitle("TAG", for: .normal)
self.addTagButton.backgroundColor = UIColor(red: 200.0/255, green: 17.0/255, blue: 57.0/255, alpha: 0.75)
self.addTagButton.addTarget(self, action: #selector(addTag), for: .touchUpInside)
self.addTagButton.layer.masksToBounds = true
self.addTagButton.clipsToBounds = true
view.addSubview(addTagButton)
self.tagTextfield.placeholder = "# or 'hey siri'"
self.tagTextfield.alpha = 1
self.tagTextfield.font = UIFont.systemFont(ofSize: 52)
self.tagTextfield.borderStyle = UITextBorderStyle.roundedRect
self.tagTextfield.autocorrectionType = UITextAutocorrectionType.no
self.tagTextfield.keyboardType = UIKeyboardType.default
self.tagTextfield.returnKeyType = UIReturnKeyType.done
self.tagTextfield.clearButtonMode = UITextFieldViewMode.whileEditing;
self.tagTextfield.contentVerticalAlignment = UIControlContentVerticalAlignment.center
self.tagTextfield.delegate = self
view.addSubview(tagTextfield)
}
override func viewDidLayoutSubviews() {
self.addTagButton.frame = CGRect(x: 10.0, y: self.view.frame.height - 77.0, width: self.view.frame.width - 20.0, height:72.0)
self.addTagButton.layer.cornerRadius = self.addTagButton.frame.width/80
self.tagTextfield.frame = CGRect(x: 10.0, y: 5.0, width: self.view.frame.width - 20.0, height:72.0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc private func addTag() {
//Database service code here...
print("in addTag .........")
//This will go where service is done and it is successful
}
internal func textFieldDidBeginEditing(_ textField: UITextField) { //delegate method
//
}
internal func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { //delegate method
return false
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool { //delegate method
textField.resignFirstResponder()
return true
}
}
在我的主UIViewController
中 - 按下按钮就会像这样加载。它得到了很好的加载 - 我只是展示了我在这里layer
的做法,以及它是如何初始化的:
@objc private func openManualTag() {
let frameHeightAdjusted = self.view.frame.height - 5/8 * self.view.frame.height
let manualTag = ManualTagController()
manualTag.view.layer.shadowColor = UIColor.black.cgColor
manualTag.view.layer.shadowOpacity = 0.3
manualTag.view.layer.shadowOffset = CGSize.zero
manualTag.view.layer.shadowRadius = 5
manualTag.view.layer.masksToBounds = true
manualTag.view.clipsToBounds = false
manualTag.view.layer.shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 159)).cgPath
manualTag.view.tag = 1
manualTag.view.frame = CGRect(x: 0, y: frameHeightAdjusted, width: self.view.frame.width, height: 159.0)
manualTag.view.transform = CGAffineTransform(translationX: 0, y: -frameHeightAdjusted - 159)
DispatchQueue.main.async {
self.view.addSubview(manualTag.view)
UIView.animate(withDuration: 0.5, animations: {
manualTag.view.transform = .identity
})
}
}
问题不在于UIButton
和UITextField
都不会起作用......无论如何都不会响应他们。我做错了什么?
更新
发布我的主视图控制器的所有ViewController
,只是包含:
import UIKit
import GoogleMaps
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
var center = CLLocationCoordinate2D()
let tagButton = TagButton()
override func viewDidLoad() {
super.viewDidLoad()
self.tagButton.addTarget(self, action: #selector(openManualTag), for: .touchUpInside)
self.tagButton.backgroundColor = UIColor(red: 200.0/255, green: 17.0/255, blue: 57.0/255, alpha: 0.5)
self.tagButton.layer.shadowColor = UIColor.black.cgColor
self.tagButton.layer.shadowPath = UIBezierPath(roundedRect: self.tagButton.bounds, cornerRadius: self.tagButton.frame.width/2).cgPath
self.tagButton.layer.shadowOffset = CGSize.zero
self.tagButton.layer.shadowOpacity = 0.3
self.tagButton.layer.shadowRadius = 5
self.tagButton.layer.masksToBounds = true
self.tagButton.clipsToBounds = false
self.tagButton.layer.borderWidth = 5
self.tagButton.layer.borderColor = UIColor.white.cgColor
view.addSubview(self.tagButton);
}
override func viewDidLayoutSubviews() {
//let tagButton = view.viewWithTag(0)
self.tagButton.frame = CGRect(x: self.view.frame.width/2 - 36, y: self.view.frame.height - 0.2 * self.view.frame.height, width: 72.0, height: 72.0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func loadView() {
let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 6.0)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
view = mapView
}
func addMarker(tag: String) {
self.locationManager.startUpdatingLocation();
let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: self.center.latitude, longitude: self.center.longitude)
marker.title = tag
//marker.snippet = //USERNAME
DispatchQueue.main.async {
marker.map = self.view as? GMSMapView
}
}
@objc private func openManualTag() {
let frameHeightAdjusted = self.view.frame.height - 5/8 * self.view.frame.height
let manualTag = ManualTagController()
manualTag.view.layer.shadowColor = UIColor.black.cgColor
manualTag.view.layer.shadowOpacity = 0.3
manualTag.view.layer.shadowOffset = CGSize.zero
manualTag.view.layer.shadowRadius = 5
manualTag.view.layer.masksToBounds = true
manualTag.view.clipsToBounds = false
manualTag.view.layer.shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 159)).cgPath
manualTag.view.tag = 1
manualTag.view.frame = CGRect(x: 0, y: frameHeightAdjusted, width: self.view.frame.width, height: 159.0)
manualTag.view.transform = CGAffineTransform(translationX: 0, y: -frameHeightAdjusted - 159)
let transparencyButton = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
transparencyButton.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha:0.4);
transparencyButton.addTarget(self, action: #selector(dismissHelper(sender:)), for: .touchUpInside)
DispatchQueue.main.async {
self.addChildViewController(manualTag)
self.view.addSubview(manualTag.view)
manualTag.didMove(toParentViewController: self)
UIView.animate(withDuration: 0.5, animations: {
manualTag.view.transform = .identity
})
self.view.insertSubview(transparencyButton, belowSubview: manualTag.view)
}
}
@objc func dismissHelper(sender: UIButton)
{
self.view.viewWithTag(1)?.removeFromSuperview()
sender.isHidden = true;
}
override func viewDidAppear(_ animated: Bool) {
self.locationManager.delegate = self
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Error" + error.localizedDescription)
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation = locations.last
self.center = CLLocationCoordinate2D(latitude: userLocation!.coordinate.latitude, longitude: userLocation!.coordinate.longitude)
let mapView = view as! GMSMapView
DispatchQueue.main.async {
mapView.camera = GMSCameraPosition.camera(withLatitude: self.center.latitude, longitude: self.center.longitude, zoom: 14.0)
}
print("Latitude :- \(userLocation!.coordinate.latitude)")
print("Longitude :-\(userLocation!.coordinate.longitude)")
self.locationManager.stopUpdatingLocation()
}
}
答案 0 :(得分:1)
当您向当前VC添加其他视图控制器视图时,必须首先将该视图控制器作为子视图添加到当前视图。这样,UIKit将正确地向子视图控制器提供所有触摸以及其他VC相关事件:
DispatchQueue.main.async {
self.addChildViewController(manualTag)
self.view.addSubview(manualTag.view)
manualTag.didMove(toParentViewController: self)
UIView.animate(withDuration: 0.5, animations: {
manualTag.view.transform = .identity
})
}
另外,我不建议您修改UIViewController的“view”属性。这可能会导致不同的问题,例如未响应您的UITextField或Autolayout崩溃。只需在viewDidLoad方法中将地图添加为全屏子视图:
super.viewDidLoad()
let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 6.0)
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
mapView.frame = view.bounds
view.addSubview(mapView)
不要忘记删除你的loadView()方法的覆盖!