转载

[SourceRead]-CAPSPageMenu

[1] 所有配置选项均为extern const string

具体来说,即:每个选项对应一个属性,在初始化方法中,通过获取到的选项字典依次给对象的各个属性赋值。

如:

// CAPSPageMenu.h extern NSString * const CAPSPageMenuOptionSelectionIndicatorHeight; extern NSString * const CAPSPageMenuOptionMenuItemSeparatorWidth;  // CAPSPageMenu.m NSString * const CAPSPageMenuOptionSelectionIndicatorHeight             = @"selectionIndicatorHeight"; NSString * const CAPSPageMenuOptionMenuItemSeparatorWidth               = @"menuItemSeparatorWidth"; 

在初始化方法中,根据遍历传入的options参数,依次给各个属性赋值。

- (instancetype)initWithViewControllers:(NSArray *)viewControllers frame:(CGRect)frame options:(NSDictionary *)options{         for (NSString *key in options) {             if ([key isEqualToString:CAPSPageMenuOptionSelectionIndicatorHeight]) {                 _selectionIndicatorHeight = [options[key] floatValue];             } else if ([key isEqualToString: CAPSPageMenuOptionMenuItemSeparatorWidth]) {                 _menuItemSeparatorWidth = [options[key] floatValue];             }     ...     } } 

在使用时,传入组装好的自定义option。

NSDictionary *parameters = @{     CAPSPageMenuOptionScrollMenuBackgroundColor: [UIColor colorWithRed:30.0/255.0 green:30.0/255.0 blue:30.0/255.0 alpha:1.0],     CAPSPageMenuOptionViewBackgroundColor: [UIColor colorWithRed:20.0/255.0 green:20.0/255.0 blue:20.0/255.0 alpha:1.0],     CAPSPageMenuOptionSelectionIndicatorColor: [UIColor orangeColor]};  _pageMenu = [[CAPSPageMenu alloc] initWithViewControllers:controllerArray frame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height) options:parameters]; [self.view addSubview:_pageMenu.view]; 

在很多系统的类库中都使用这种方式来传递自定义的选项值。比如 NSAttributedString 的初始化方法 -initWithString:attributes: 中的 attributes 是自己组装的dictionary,而其中的key就是UIKit下 NSAttributedString.h 中的“Predefined character attributes for text.”

以后在写自己的类库中可以参考这种方式。

[2] 关于 UIScrollViewscrollsToTop 属性

当用户点击status bar时,点击位置下面最靠近status bar的scroll view会滚到顶部,但只有以下条件都满足时才会生效:

  • scrollsToTop 属性值为 YES
  • 代理方法 shouldScrollViewScrollToTop 没有返回 NO
  • 没有已经处于顶部。

这里需要注意的是,如果有 不止一个 scroll view的 scrollsToTop 被置为 YES ,那么 所有 scroll view的“点击滚动到顶部” 都不会生效

然而,UIScrollView的 scrollsToTop 默认是 YES …所以,对于 CAPSPageMenu 中的两个scroll view,作者都手动将它们的 scrollsToTop 置为了 NO

_menuScrollView.scrollsToTop       = NO;; _controllerScrollView.scrollsToTop = NO;; 

另外,对于 UIScrollView 的子类们,如 UITableViewUICollectionViewUITextViewUIContainerView 等,该规则同样适用。

[3] 为什么在点击item时需要一个Timer?

未知。。。

[4] -gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:

虽然view和gesture recognizer可以是一对多的关系,但默认情况下,两个gesture recognizer是不能同时有效的。此时,若想两个gesture recognizer能同时处理它们各自的gesture,需要重写 UIScrollView 的protocol -gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: ,并在其中返回 YES

在一个gesture recognizer对于gesture的识别会阻塞另一个gesture recognizer的gesture识别时,这个方法就会被调用了。

当然,也可以根据需要在其中添加判断条件,使之返回不同的值。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {     if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]  && [otherGestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {              return YES;        }         return NO; } 

Ref:

原文  http://www.calios.gq/2016/05/25/[SourceRead]-CAPSPageMenu/
正文到此结束
Loading...