18

SWRevealViewControllerアプリにサイド ナビゲーション メニューを実装するために使用しています。ユーザーが正面図をタップすると背面図が閉じ、正面図が再び操作できるようになることを除いて、背面図が開いているときに正面図を操作できないようにしたいと思います。現在、フロント ビューから対話を削除するこれら 2 つのSWRevealViewControllerデリゲート メソッドがあります。

- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition:    (FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    }
}

- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:    (FrontViewPosition)position {
    if(position == FrontViewPositionLeft) {
        self.view.userInteractionEnabled = YES;
    } else {
        self.view.userInteractionEnabled = NO;
    }
}

ただし、これにより、正面図がタップされたときに背面図が閉じることはありません。どんな助けでも大歓迎です、ありがとう!

4

9 に答える 9

31

SWIFT を使用している場合は、frontViewController で次のようなことができます。

override func viewDidLoad() {
    super.viewDidLoad()

    if self.revealViewController() != nil {

        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
        self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
    }

}

コードは TAP および PAN ジェスチャで機能します。

于 2015-03-25T18:41:24.383 に答える
23

frontViewController の ViewDidLoad に、UITapGestureRecognizer

SWRevealViewController *revealController = [self revealViewController];
UITapGestureRecognizer *tap = [revealController tapGestureRecognizer];
tap.delegate = self;

[myView addGestureRecognizer:tap];

これにより、フロント ビューがタップされたときにリア ビューが閉じます。これはSWRevealViewControllerのデフォルトの動作です。

于 2014-03-16T20:40:37.960 に答える
12

編集: Marrocコメントのおかげで、UIView の autoresizingMask を Swift 2 に合わせて変更します

これは、@avdyushinの回答のSwift-SWRevealViewController 2.xバージョンです。

func revealController(revealController: SWRevealViewController!, willMoveToPosition position: FrontViewPosition) {
    let tagId = 4207868622

    if revealController.frontViewPosition == FrontViewPosition.Right {
        let lock = self.view.viewWithTag(tagId)
        UIView.animateWithDuration(0.25, animations: {
                lock?.alpha = 0
            }, completion: {(finished: Bool) in
                lock?.removeFromSuperview()
            }
        )
        lock?.removeFromSuperview()
    } else if revealController.frontViewPosition == FrontViewPosition.Left {
        let lock = UIView(frame: self.view.bounds)
        lock.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        lock.tag = tagId
        lock.alpha = 0
        lock.backgroundColor = UIColor.blackColor()
        lock.addGestureRecognizer(UITapGestureRecognizer(target: self.revealViewController(), action: "revealToggle:"))
        self.view.addSubview(lock)
        UIView.animateWithDuration(0.75, animations: {
                lock.alpha = 0.333
            }
        )
    }
}
于 2015-08-11T12:16:00.303 に答える
4

この簡単な解決策を検討してください。完璧に機能します

private let DimmingViewTag = 10001

extension UIViewController: SWRevealViewControllerDelegate {    

    func setupMenuGestureRecognizer() {

        revealViewController().delegate = self

        view.addGestureRecognizer(revealViewController().panGestureRecognizer())
        view.addGestureRecognizer(revealViewController().tapGestureRecognizer())
    }

    //MARK: - SWRevealViewControllerDelegate

    public func revealController(revealController: SWRevealViewController!, didMoveToPosition position: FrontViewPosition) {

        if case .Right = position {

            let dimmingView = UIView(frame: view.frame)
            dimmingView.tag = DimmingViewTag

            view.addSubview(dimmingView)
            view.bringSubviewToFront(dimmingView)

        } else {
            view.viewWithTag(DimmingViewTag)?.removeFromSuperview()
        }
    }
}

での簡単な使い方UIViewController:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    setupMenuGestureRecognizer()
}
于 2016-07-01T07:35:55.760 に答える
0

私は tapGestureRecognizer を使用しましたが、まだいくつかの問題があります。私はこれを試してみましたが、うまくいきました!

クラスを定義します:

@interface IgnoreView : UIView

@property (nonatomic, assign) BOOL shouldAllTouchesBeForMe;

@end

埋め込む:

@implementation IgnoreView

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if( self.shouldAllTouchesBeForMe ){
        return self;
    }
    return [super hitTest:point withEvent:event];
}

@end

次に、クラス IgnoreView の Interface Builder で View クラスを作成します

次に、ViewController で次のようにします。

in - viewDidLoad

self.revealViewController.delegate = self;
[self.view addGestureRecognizer:self.revealViewController.tapGestureRecognizer];

ビューコントローラーの実装も:

- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position
{
    IgnoreView *i = (id)self.view;
    i.shouldAllTouchesBeForMe = position == FrontViewPositionRight;
}

これで準備完了です。

于 2015-09-08T19:09:18.553 に答える
-2

Menu view controllerで、これを追加します。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.revealViewController.frontViewController.view setUserInteractionEnabled:NO];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    [self.revealViewController.frontViewController.view setUserInteractionEnabled:YES];
}

次に、Menu Item View Controllerで、これをviewDidLoadに追加します。

SWRevealViewController *revealController = [self revealViewController];
[revealController tapGestureRecognizer];

ここで私の答えもチェックしてください。これは、正面からのインタラクション (およびスライド ジェスチャ) の問題に対処します。

于 2014-05-26T04:10:13.037 に答える