具体来说,即:每个选项对应一个属性,在初始化方法中,通过获取到的选项字典依次给对象的各个属性赋值。
如:
// 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; }