2017-06-08 10 views
0

SEにはこの問題に関するいくつかの記事がありますが、自分の状況に適したソリューションを見つけることができませんでした。ビューコントローラとの対話

私はビューコントローラ内にマップビューを持っています。私はこのシナリオのためにしたいことは、マップビューはまだできるようにすることです

Location Card on Map View

:私は、マップビューVCの上に(カードビューを収容する)customとしてmodalPresentationStyleセットで別のビューコントローラを提示しています位置カードが内部に接触していることを依然として認識している位置カードと共に提示されたときに接触を認識する。下のリストビューが表示されているときのApple Mapsの機能と似ています。提示

    • 私は非常に嫌いますマップビューに場所カードをダンプ:

      は、私は、ビューコントローラを介してタッチを渡すことはできませんが、私は間で決めることはできません知っていますロケーションカードをaddChildViewController経由で渡します。これは、私が望む効果を達成するためにどのように実装するのかはわかりません。

    This SE question私はまだ問題を解決する方法を見つけることができませんが、アップルマップのインターフェイスを模倣して詳細な答えと小さなサンプルプロジェクトを提供します。

  • +0

    提示されたビュー(カードビュー)で接触を検出しますか? –

    +0

    @AravindARはい、それもそうです。質問を更新する... –

    +0

    全く新しいビューコントローラの代わりにカスタムビューを使用してサブビューとして追加するだけではどうですか? – CoderFrom94

    答えて

    0

    私は、ロケーションカードビューをマップビューにダンプするオプションを使用しました。しかし、私はそれを嫌うことはありませんでした。

    地図ビュー内にロケーションカードのロジックが欲しくないということがありました。しかし同時に、iOSはインフラストラクチャを提供しておらず、View Controller間のタッチ転送は基本的に不可能で、提案された回避策は実装が難しいようでした。

    まず、ビューコントローラからロケーションカードビューを移行して構造体にしました。

    次に、LocationCardPresentableというプロトコルを定義しました。拡張された場合、SelfのタイプはMapVCである必要があります。したがって、プロトコル拡張の中で、私がMapVCの中にいるが実際にはそうでない場合のように動作することができます。プロトコルエクステンションには、MapVCから呼び出すことのできるロケーションカードの提示と解除のためのさまざまな方法があります。

    p.s.今のところサンプルコードなしの簡単な説明です。十分な時間があれば、はるかに詳細な説明が提供されます。

    0

    だから私は提示のViewControllerにrootViewを交換する(内側)loadViewメソッド()ポイントの組み合わせを使用することにより、今これを修正するために管理。

    まず、あなたはタッチが下ViewControllersに渡すことにしたい任意のViewControllersであなたのrootViewとして使用するのUIViewのサブクラスを作る:

    IgnoreTouchesView

    import UIKit 
    

    クラスIgnoreTouchesViewを: UIView {

    override init(frame: CGRect) { 
        super.init(frame: frame) 
    
    } 
    
    required init?(coder aDecoder: NSCoder) { 
        fatalError("init(coder:) has not been implemented") 
    } 
    
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
        for view in self.subviews { 
         if view.isKind(of: UIButton) { 
          let foundButtonView = view 
    
          if foundButtonView.isUserInteractionEnabled && !foundButtonView.isHidden && foundButtonView.point(inside: self.convert(point, to: foundButtonView), with: event) { 
           return true 
          } 
         } 
        } 
    
        return false 
    } 
    

    ポイント(内部)機能は、ユーザーがy UIButtonsをオーバーレイVCに入れます。この場合、タッチは引き続き処理する必要があります。他のタッチは下のVCに渡されます。これはrootViewを無視するだけで別の方法で行うこともできますが、私はまだこれを行う方法を理解していません。その後

    、あなたは、提示し、次を追加したいVCに:

    let ignoreView: IgnoreTouchesView = { 
        let view = IgnoreTouchesView(frame: .zero) 
        view.translatesAutoresizingMaskIntoConstraints = false 
        return view 
    }() 
    
    override func loadView() { 
        view = ignoreView 
    } 
    

    今すぐあなたの元のViewControllerにViewControllersを追加します。

    lazy var overlayVC : OverlayVC = { 
        let vc = SongOverlayVC() 
        vc.view.translatesAutoresizingMaskIntoConstraints = false 
        vc.delegate = self 
        return vc 
    }() 
    
    viewDidLoad(){ 
        view.addSubview(songOverlayVC.view) 
    } 
    

    そして、それはそれだ:)

    問題が発生した場合はお知らせください。

    関連する問題