测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2014 年 12 月 |
由 Kevin Donnelly 维护。
UIPageControl 的直接替代品,它允许使用遮罩效果实现不同点样式的无缝切换,每种页面一个。
UIPageControl 常与 UIScrollView 一起使用。在 iOS 6 中,添加了更改 UIPageControl 中点颜色的功能。当 ScrollView 中的页面具有一致的主题时,这非常出色。但是,如果您的滚动视图对每个页面都有独特的调色板,没有优雅的方式来切换两种颜色。添加背景可能会使 UI 过于混乱,或在滚动后切换颜色会导致控件在手势期间看起来很奇怪。
KVNMaskedPageControl 允许您通过类似于 UITableView 中使用的数据源为每个页面定义一种颜色。通过传递滚动事件到控件,它可以在页面的边界上无缝地切换不同的样式。
要手动安装,将以下文件复制到您的项目中
KVNMaskedPageControl 是 UIPageControl 的替代品,并且只需要一个更改即可使用:**不要使用 UIPageControl 方法设置指示器和当前页面颜色**。相反,实现数据源方法,并按需提供它们。KVNMaskedPageControl 还可以从 XIB/Storyboard 创建。
KVNMaskedPageControl *pageControl = [[KVNMaskedPageControl alloc] init];
[pageControl setNumberOfPages:pageNumber];
[pageControl setCenter:somePoint];
[pageControl setDataSource:self];
实现数据源方法以按需提供页面颜色。为了考虑到过度滚动或反弹,**可能的索引范围是 -1 到 N+1**。两个方法中任一返回 nil 都会将默认 UIPageControl 颜色设置为,或由 UIApperanceProxy 定义的颜色。
- (UIColor *)pageControl:(KVNMaskedPageControl *)control pageIndicatorTintColorForIndex:(NSInteger)index {
if (index % 2 == 0) {
return nil;
} else {
return [UIColor colorWithWhite:0 alpha:.5];
}
}
- (UIColor *)pageControl:(KVNMaskedPageControl *)control currentPageIndicatorTintColorForIndex:(NSInteger)index {
if (index % 2 == 0) {
return nil;
} else {
return [UIColor colorWithWhite:0 alpha:.8];
}
}
要更新遮罩,向控件提供当前的 UIScrollView 偏移量和框架。偏移量和框架都必须使用页面控制的父视图作为参考框架。如果页面控制和滚动视图共享父视图,则传递的值可以保持不变。如果不是这种情况,则需要从父视图参考框架中计算这些值。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self.pageControl maskEventWithOffset:scrollView.contentOffset.x frame:scrollView.frame];
}
此组件是为与UIScrollView一起使用而设计的,这就是为什么 maskEventWithOffset:
和创建遮罩效果的数学运算与UIScrollView的几何形状和滚动事件紧密耦合。对于其他用途,您可以创建一个子类,定义自己的方法来调用数据源以设置正确的颜色,并将下一页要显示的颜色百分比(原点在右侧)传递给 updateMaskWithPercentage
。
或者,您可以尝试修改 maskEventWithOffset:
的行为。将分页控件的界限作为框架传递将允许您将当前页要显示的任何宽度的宽度作为偏移量发送。将边界的多倍加到偏移量上可以递增页码。
// 1st page, no mask
[self.pageControl maskEventWithOffset:0 frame:self.pageControl.bounds];
// 1st page, 50/50 mask with 2nd page
[self.pageControl maskEventWithOffset:CGRectGetWidth(self.pageControl.bounds) / 2 frame:self.pageControl.bounds];
// 2nd page, no mask
[self.pageControl maskEventWithOffset:CGRectGetWidth(self.pageControl.bounds) frame:self.pageControl.bounds];
// 2nd page, 50/50 mask with 3rd page
[self.pageControl maskEventWithOffset:CGRectGetWidth(self.pageControl.bounds) + CGRectGetWidth(self.pageControl.bounds) / 2 frame:self.pageControl.bounds];
iOS 6+ ARC
Kevin,[email protected]
KVNMaskedPageControl可在MIT许可下使用。更多信息请参阅LICENSE文件。