回転メニューバーの実現『二』

3041 ワード

2017年の初日に出勤して、皆さん新年おめでとうございます.去年まだ少し残っていたことを思い出して、怠けないでください.今日は急いで完成しました.次は本題に戻りましょう.この文章は前の文章に基づいているので、前の文章を知らない人は次の文章を見てください.http://www.jianshu.com/p/9c31b93d53d7
私たちはすでに回転メニューバー全体の大まかな効果を実現しましたが、製品マネージャにはこのような需要があるかもしれません.メニューが回転するときにクリックする必要があります.このとき、私たちはどのように実現すればいいですか.簡単ではないと言うかもしれませんが、ボタンにクリックイベントを直接追加すればいいのではないでしょうか.はい、確かに、私たちのメニューはすべてボタンを使って作ったので、自然とみんながボタンにクリックイベントを追加したいと思っていますが、ここはみんなを失望させるかもしれません.もし私たちがボタンにクリックイベントを追加したら、私たちがクリックした後に何の応答もないことに気づきました.信じないなら、やってみてください.どうしてですか.理由は簡単で、私たちが示したときはlayerでやったのです.それなら、私たちはどのように実現すればいいのでしょうか.
こんなくだらないことを言ったら、ここでテーマに入り、ビューにtapジェスチャーを追加し、ジェスチャーの中でクリックロジックを処理します.次はコード部分です.
    //      
    UITapGestureRecognizer * tapGes =    [[UITapGestureRecognizer alloc ] initWithTarget:self action:@selector(serviceTaped:)];
   [self addGestureRecognizer:tapGes];

tapクリックイベント
    CGPoint touchPoint = [tap locationInView:self];
    __weak typeof(self) weakSelf = self;
    [self.btnsArray enumerateObjectsUsingBlock:^(UIButton  * circleBtn, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([circleBtn.layer.presentationLayer hitTest:touchPoint]) {
            weakSelf.circleButtonType = idx;
            [weakSelf.nextResponder routerEventWithName:@"CircleButtonClick"
                                               userInfo:@{@"object":circleBtn,@"type":@(weakSelf.circleButtonType)}];
        }
    }];

実は最も重要なのはあなたがビューの1つの属性presentationLayerを知っていて、クリックする位置が異なることを通じて異なる論理を処理して、ここを見てきっと多くの見官が言うことを見て、この文章はこのように材料を少し使いますか、専門的に1つの文章を使ってlayerに少し打撃事件を追加しますか?もちろんそうではありません.単独で1つの文章を持って事件をクリックするのは、きっと少し予想してから書くに違いありません.そうしないと、私自身もつまらないと思います.次は次の点について話します.
クリックイベントの転送
注意深い見官は、tapクリックイベントに説明されていない場所があることに気づいたに違いありません.次のコードです.
 [weakSelf.nextResponder routerEventWithName:@"CircleButtonClick"
                                               userInfo:@{@"object":circleBtn,@"type":@(weakSelf.circleButtonType)}];

実はこのコードの役割はクリックイベントをコントローラに伝えることに相当し、私たちがよく書くエージェントやblockに相当します.私たちは以前blockやエージェントを使ってクリックイベントを伝えることに慣れていましたが、ネストされた階層が深いときに代理やblockを使うと煩雑になることがあります.もちろんこの方式は私も别のブログから学んだので、具体的にどの1篇も私も忘れました_実現の原理は実は応答チェーンを通じて伝達され、ここのnextResponderは伝達者で、routerEventWithNameという方法は私が書いた分類方法で、私たちはコントローラの中でこの方法を実現するだけで事件を伝達することができて、聞いているのはとても爽やかではありませんか.次は分類を出しましょう.
#import 

@interface UIResponder (Router)

/**
 *           ,  eventName     UIResponsder          
 *
 *  @param eventName        
 *  @param userInfo       ,      ,        ,         
 *
 */
- (void)routerEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo;

@end

#import "UIResponder+Router.h"

@implementation UIResponder (Router)

- (void)routerEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo
{
    [[self nextResponder] routerEventWithName:eventName userInfo:userInfo];
}

@end


これだけ话して、あなたを助けることができることを望んで、私もただ自分の経験を分かち合うだけで、喷かないでくださいが好きではありませんて、伝言の交流を歓迎します.