2017-12-02 3 views
0

: Ich bin zu schnell, ich habe diesen Code ist es die UIViewController für die UITextField und UIButton:UIButton und UITextField reagieren nicht als Teil von UIViewController

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 
    } 
} 

In meinem Haupt UIViewController - es wird geladen So, auf einen Knopf klicken. es wird fein geladen - Ich zeige nur, wie ich die layer hier tue, und wie es initialisiert wird:

@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 
      }) 
     } 
    } 

Das Problem ist weder die UIButton noch die UITextField funktioniert ... weder reagieren sie in dem Abstich sowieso. Was mache ich falsch?

UPDATE

alle ViewController Posting, mein Haupt-View-Controller, nur für den Fall:

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

Sind beide ihrer 'isUserInteractionEnabled' Eigenschaften auf true gesetzt? – Xcoder

+0

danke aber es hat nicht geholfen – ewizard

+0

der bildschirm reagiert auf meine wasserhähne außerhalb der ansicht von mantag, wenn es geöffnet ist – ewizard

Antwort

1

Wenn Sie eine andere Ansicht-Controller Ansicht Ihrer aktuellen VC fügen Sie müssen zunächst, dass hinzufügen Betrachte Controller als Kind zu deinem aktuellen. Auf diese Weise UIKit korrekt alle Berührungen sowie andere VC Ereignisse im Zusammenhang mit dem Kind-View-Controller bieten:

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 
    }) 
} 

Auch Sie, dass ich nicht empfehlen „Ansicht“ Eigenschaft eines UIViewController zu ändern. Dies kann zu unterschiedlichen Problemen führen, z. B. wenn Sie nicht auf Ihre UITextField- oder Autolayout-Abstürze reagieren. Fügen Sie einfach Ihre Karte als Vollbild-Subview in der viewDidLoad Methode:

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) 

Und vergessen Sie nicht, Ihren überwiegenden von Loadview() -Methode zu entfernen!

+0

danke! das löst die Schaltfläche auf manualTag .... aber das UITextField reagiert immer noch nicht – ewizard

+0

, so dass die UITextField-Delegate-Methoden nicht aufgerufen werden, nicht wahr? –

+0

eine Tastatur taucht nie auf ... ill log die Methoden – ewizard

Verwandte Themen