2015-10-29 3 views
6

Я создал пользовательский callOutView, который, кажется, работает нормально. Однако у меня есть проблема с обработкой касания на пользовательском представлении callOut. Я бы хотел нажать на определенный viewController, когда он будет выбран. Как я могу достичь этого?Ручка выбора пользовательского CallOutView swift

ниже я добавил свой FBSingleClusterView, который является обычным MKAnnotationView и bubbleView, который является обычным callOutView. помимо этого, я имею в виду viewController с mapView.

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.

Во-первых, установите «Идентификатор раскадровки» для viewController в вашем раскадровке. Как это:

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

Вот ссылка от компании Apple Dev: InstantiateViewControllerWithIdentifier

+0

мне нужно обнаружить ушко bubbleView? –

+0

Я не понял ваш комментарий. Что вы имеете в виду? – lukaivicev

+0

Извините, я просто не совсем понимаю, что вы имеете в виду и как я могу получить это от hitTest? –

1

Вы можете добавить жест на настраиваемое представление аннотаций в didselectannotation и перейти к другой вид Controllor от жеста действия

Смежные вопросы