2015-10-29 6 views
6

Ich habe eine benutzerdefinierte CallOutView erstellt, die scheinen gut zu funktionieren. Jedoch habe ich ein Problem mit dem Tippen auf die benutzerdefinierte CallOut-Ansicht. Ich möchte gerne zu einem bestimmten ViewController, wenn es ausgewählt ist. Wie kann ich das erreichen?Handle Auswahl von benutzerdefinierten CallOutView Swift

unten habe ich meine FBSingleClusterView, die die benutzerdefinierte MKAnnotationView und die bubbleView ist, die benutzerdefinierte callOutView ist. daneben habe ich natürlich einen ViewController mit einem mapView.

FBSingleClusterView Variables

private var hitOutside:Bool = true 


var preventDeselection:Bool { 
    return !hitOutside 
} 

FBSingleClusterView Methoden

override func setSelected(selected: Bool, animated: Bool) { 

    let calloutViewAdded = bubbleView?.superview != nil 

    if (selected || !selected && hitOutside) { 
     super.setSelected(selected, animated: animated) 
    } 

    self.superview?.bringSubviewToFront(self) 

    if (bubbleView == nil) { 
     bubbleView = BubbleView() 
    } 

    if (self.selected && !calloutViewAdded) { 
     bubbleView?.clipsToBounds = true 
     bubbleView?.layer.masksToBounds = true 
     self.addSubview(bubbleView!) 

     let discView = UIImageView() 
     discView.contentMode = UIViewContentMode.Center 
     discView.image = UIImage() 
     discView.image = UIImage(named: "Disclosure") 

     bubbleView?.contentView.addSubview(discView) 


     let nameLabel = UILabel() 
     nameLabel.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 
     nameLabel.font = UIFont.systemFontOfSize(10) 
     nameLabel.textColor = UIColor.whiteColor() 
     nameLabel.text = companyString?.uppercaseString 


     bubbleView?.addSubview(nameLabel) 

     discView.snp_makeConstraints { (make) -> Void in 
      make.top.equalTo(bubbleView!).offset(0) 
      make.height.equalTo(30) 
      make.width.equalTo(20) 
      make.right.equalTo(bubbleView!).offset(0) 

     } 

     nameLabel.snp_makeConstraints { (make) -> Void in 
      make.top.equalTo(bubbleView!).offset(0) 
      make.left.equalTo(bubbleView!).offset(10) 
      make.height.equalTo(30) 
      make.right.equalTo(bubbleView!).offset(-20) 
     } 

     let nameLabelWidth = nameLabel.requiredWidth(companyString!.uppercaseString, font: UIFont.systemFontOfSize(10)) + 35 

     let bubbleHeight = 35 as CGFloat 

     bubbleView?.frame = CGRectMake((self.frame.width/2)-(nameLabelWidth/2), -bubbleHeight-2, nameLabelWidth, bubbleHeight) 

    } 

    if (!self.selected) { 
     bubbleView?.removeFromSuperview() 
    } 



} 

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
    var hitView = super.hitTest(point, withEvent: event) 

    if let callout = bubbleView { 
     if (hitView == nil && self.selected) { 
      hitView = callout.hitTest(point, withEvent: event) 
     } 
    } 

    hitOutside = hitView == nil 

    return hitView; 
} 

Bubble Methoden

override public func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     let viewPoint = superview?.convertPoint(point, toView: self) ?? point 

     //  let isInsideView = pointInside(viewPoint, withEvent: event) 

     let view = super.hitTest(viewPoint, withEvent: event) 

     return view 
    } 

    override public func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
     return CGRectContainsPoint(bounds, point) 
    } 



} 

Antwort

3

Haben Sie versucht, instantiateViewControllerWithIdentifier zu verwenden? Sie können dies auslösen, wenn Sie auf eine Schaltfläche tippen, in der viewDidLoad oder in irgendeiner anderen Methode, die Sie auslösen möchten, und drücken Sie einen neuen ViewController.

Zuerst legen Sie die "Storyboard ID" für die ViewController in Ihrem Storyboard. Wie folgt aus:

enter image description here

Beispiel:

Hier ist ein Beispiel dafür, wie man zu einem neuen Viewcontroller schieben kann, wenn eine Zelle tippen. Wie bereits erwähnt können Sie diese Methode in unterschiedlichen Funktionen an einem anderen Viewcontroller schieben verwenden:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let yourNewView = self.storyboard!.instantiateViewControllerWithIdentifier("yourStoryBoardID") as! ViewControllerYourePushingTo 


     self.presentViewController(yourNewView, animated: true, completion: nil) 


} 

In Ihrem Fall ist dies in dem hitTest Func.

Ich habe eine ähnliche Frage vor nicht allzu langer Zeit gestellt. Hier ist die Referenz: Swift: Triggering TableViewCell to lead to a link in a UIWebView in another ViewController

Hier ist der Link von Apple Dev: InstantiateViewControllerWithIdentifier

+0

Ich brauche eine Registerkarte zu erkennen das bubbleView? –

+0

Ich habe Ihren Kommentar nicht verstanden. Was meinen Sie? – lukaivicev

+0

Sorry, ich bin mir nicht ganz sicher, was du meinst und wie ich das von hitTest bekomme? –

1

Sie können Geste auf benutzerdefinierte Anmerkungsansicht in didselectannotation hinzufügen und navigieren Sie zu anderer Ansicht controllor aus Geste Aktion