2015-10-29 29 views
6

我創建了一個自定義的callOutView,這似乎工作正常。不過,我有問題處理點擊自定義callOut視圖。當我選擇它時,我想推到一個特定的viewController。我怎樣才能做到這一點?處理選擇的自定義CallOutView swift

下面我添加了我的FBSingleClusterView,這是自定義的MKAnnotationView和bubbleView這是自定義callOutView。除此之外,我還有一個帶有mapView的viewController。

FBSingleClusterView變量

private var hitOutside:Bool = true 


var preventDeselection:Bool { 
    return !hitOutside 
} 

FBSingleClusterView方法

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

bubbleView方法

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



} 

回答

3

您是否嘗試過使用instantiateViewControllerWithIdentifier?您可以在點擊按鈕時觸發此操作,在viewDidLoad中,或者您希望觸發的任何其他方法,並推送新的viewController。

首先,在storyboard中爲viewController設置「Storyboard ID」。就像這樣:

enter image description here

例子:

下面是攻一個細胞時如何推到一個新的viewController的例子。如前所述,你可以使用不同的功能這種方法推到另一個的viewController:

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

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


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


} 

你的情況,這是在hitTest FUNC。

不久前,我問了一個類似的問題。這裏的參考:Swift: Triggering TableViewCell to lead to a link in a UIWebView in another ViewController

下面是蘋果開發的鏈接:InstantiateViewControllerWithIdentifier

+0

我需要在檢測標籤bubbleView? –

+0

我不理解您的評論。你什麼意思? – lukaivicev

+0

對不起,我只是不太確定你的意思,我怎麼能從hitTest得到這個? –

1

可以在didselectannotation定製註解視圖中添加姿態,導航到手勢動作等觀點controllor