【问题标题】:Handle selection of custom CallOutView swift处理选择自定义 CallOutView swift
【发布时间】:2015-10-29 17:34:40
【问题描述】:

我创建了一个自定义 callOutView,它似乎工作正常。但是,我在处理自定义 callOut 视图上的点击时遇到问题。我想在选择时推送到特定的 viewController。我怎样才能做到这一点?

下面我添加了我的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)
    }



}

【问题讨论】:

    标签: ios swift mkmapview


    【解决方案1】:

    您是否尝试过使用instantiateViewControllerWithIdentifier?您可以在点击按钮、viewDidLoad 或您希望它触发并推送新的 viewController 的任何其他方法时触发此操作。

    首先,在情节提要中为 viewController 设置“情节提要 ID”。像这样:

    例子:

    下面是一个例子,说明如何在点击单元格时推送到新的 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 函数中。

    不久前我问了一个类似的问题。这是参考:Swift: Triggering TableViewCell to lead to a link in a UIWebView in another ViewController

    这是来自 Apple Dev 的链接:InstantiateViewControllerWithIdentifier

    【讨论】:

    • 我需要在bubbleView上检测标签吗?
    • 我不明白你的评论。什么意思?
    • 抱歉,我不太清楚你的意思以及我如何从 hitTest 得到这个?
    • 能否举个例子说明如何使用
    • 你想用哪种方法触发对新viewController的推送?
    【解决方案2】:

    您可以在 didselectannotation 中的自定义注释视图上添加手势,并从手势操作导航到其他视图控制器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多