2015-10-29 19 views
6

Tôi đã tạo một callOutView tùy chỉnh, có vẻ hoạt động tốt. Tuy nhiên tôi có vấn đề với xử lý tap vào khung nhìn callOut tùy chỉnh. Tôi muốn đẩy đến một viewController cụ thể khi nó được chọn. Làm thế nào tôi có thể đạt được điều này?Xử lý lựa chọn tùy chỉnh CallOutView swift

bên dưới tôi đã thêm FBSingleClusterView, là tùy chỉnh MKAnnotationView và bubbleView là tùy chỉnh callOutView. bên cạnh i ofcourse này có một viewController với một mapView.

Biến FBSingleClusterView

private var hitOutside:Bool = true 


var preventDeselection:Bool { 
    return !hitOutside 
} 

phương pháp 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; 
} 

phương pháp 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) 
    } 



} 

Trả lời

3

Bạn đã thử sử dụng instantiateViewControllerWithIdentifier chưa? Bạn có thể kích hoạt điều này khi khai thác một nút, trong viewDidLoad hoặc trong bất kỳ phương pháp nào khác mà bạn muốn nó kích hoạt và đẩy một viewController mới.

Thứ nhất, đặt "Storyboard ID" cho viewController trong bảng phân cảnh của bạn. Như thế này:

enter image description here

Ví dụ:

Dưới đây là một ví dụ về cách bạn có thể đẩy đến một viewController mới khi khai thác một tế bào. Như đã đề cập, bạn có thể sử dụng phương pháp này trong các chức năng khác nhau để push to viewController khác:

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

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


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


} 

Trong trường hợp của bạn này nằm ở cùng hitTest func.

Tôi đã hỏi một câu hỏi tương tự cách đây không lâu. Dưới đây là tài liệu tham khảo: Swift: Triggering TableViewCell to lead to a link in a UIWebView in another ViewController

Dưới đây là liên kết từ Apple Dev: InstantiateViewControllerWithIdentifier

+0

tôi cần phải phát hiện một tab trên bubbleView? –

+0

Tôi không hiểu nhận xét của bạn. Ý anh là gì? – lukaivicev

+0

Xin lỗi tôi chỉ không hoàn toàn chắc chắn những gì bạn có ý nghĩa và làm thế nào tôi có thể nhận được điều này từ hitTest? –

1

Bạn có thể thêm cử chỉ trên xem chú thích tùy chỉnh trong didselectannotation và điều hướng đến xem controllor khác từ hành động cử chỉ

Các vấn đề liên quan