具体来说,即:每个选项对应一个属性,在初始化方法中,通过获取到的选项字典依次给对象的各个属性赋值。
如:
// 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.”
以后在写自己的类库中可以参考这种方式。
UIScrollView 的 scrollsToTop 属性 当用户点击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 的子类们,如 UITableView 、 UICollectionView 、 UITextView 、 UIContainerView 等,该规则同样适用。
未知。。。
-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; }