DNSPageView的Objective-C版本,是一个灵活且易于使用的pageView框架,titleView和contentView可以布局在任意地方,可以纯代码初始化,也可以使用xib或者storyboard初始化,并且提供了常见样式属性进行设置。
如果你使用的开发语言是Swift,请使用DNSPageView
iOS 8.0+
Xcode 9.0+
CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
CocoaPods 1.1+ is required to build DNSPageView.
To integrate DNSPageView into your Xcode project using CocoaPods, specify it in your Podfile
:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target '<Your Target Name>' do
pod 'DNSPageView-ObjC'
end
Then, run the following command:
$ pod install
If you prefer not to use any of the aforementioned dependency managers, you can integrate DNSPageView-ObjC into your project manually.
To run the example project, clone the repo, and run DNSPageView.xcodeproj
.
// 创建DNSPageStyle,设置样式
DNSPageStyle *style = [[DNSPageStyle alloc] init];
style.titleViewScrollEnabled = YES;
style.titleScaleEnabled = YES;
// 设置标题内容
NSArray <NSString *>*titles = @[@"头条", @"视频", @"娱乐", @"要问", @"体育" , @"科技" , @"汽车" , @"时尚" , @"图片" , @"游戏" , @"房产"];
// 创建每一页对应的controller
NSMutableArray *childViewControllers = [NSMutableArray array];
for (NSString *title in titles) {
UIViewController *controller = [[UIViewController alloc] init];
[self addChildViewController:controller];
[childViewControllers addObject:controller];
}
CGFloat y = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.frame.size.height;
CGSize size = [UIScreen mainScreen].bounds.size;
// 创建对应的DNSPageView,并设置它的frame
DNSPageView *pageView = [[DNSPageView alloc] initWithFrame:CGRectMake(0, y, size.width, size.height) style:style titles:titles childViewControllers:childViewControllers startIndex:0];
[self.view addSubview:pageView];
在xib或者storyboard中拖出2个UIView,让它们分别继承DNSPageTitleView和DNSPageContentView,拖线到代码中
@property (weak, nonatomic) IBOutlet DNSPageTitleView *titleView;
@property (weak, nonatomic) IBOutlet DNSPageContentView *contentView;
对DNSPageTitleView和DNSPageContentView进行设置
// 创建DNSPageStyle,设置样式
DNSPageStyle *style = [[DNSPageStyle alloc] init];
style.titleViewBackgroundColor = [UIColor redColor];
style.showCoverView = YES;
// 设置标题内容
NSArray <NSString *>*titles = @[@"头条", @"视频", @"娱乐", @"要问", @"体育"];
// 设置默认的起始位置
NSInteger startIndex = 2;
// 对titleView进行设置
self.titleView.titles = titles;
self.titleView.style = style;
self.titleView.currentIndex = startIndex;
// 最后要调用setupUI方法
[self.titleView setupUI];
// 创建每一页对应的controller
NSMutableArray *childViewControllers = [NSMutableArray array];
for (NSString *title in titles) {
UIViewController *controller = [[UIViewController alloc] init];
[self addChildViewController:controller];
[childViewControllers addObject:controller];
}
// 对contentView进行设置
self.contentView.childViewControllers = childViewControllers;
self.contentView.startIndex = startIndex;
self.contentView.style = style;
// 最后要调用setupUI方法
[self.contentView setupUI];
// 让titleView和contentView进行联系起来
self.titleView.delegate = self.contentView;
self.contentView.delegate = self.titleView;
创建DNSPageViewManager
- (DNSPageViewManager *)pageViewManager {
if (!_pageViewManager) {
// 创建DNSPageStyle,设置样式
DNSPageStyle *style = [[DNSPageStyle alloc] init];
style.showBottomLine = YES;
style.titleViewScrollEnabled = YES;
style.titleViewBackgroundColor = [UIColor clearColor];
// 设置标题内容
NSArray <NSString *>*titles = @[@"头条", @"视频", @"娱乐", @"要问", @"体育"];
// 创建每一页对应的controller
NSMutableArray *childViewControllers = [NSMutableArray array];
for (NSString *title in titles) {
UIViewController *controller = [[UIViewController alloc] init];
[self addChildViewController:controller];
[childViewControllers addObject:controller];
}
_pageViewManager = [[DNSPageViewManager alloc] initWithStyle:style titles:titles childViewControllers:childViewControllers startIndex:0];
}
return _pageViewManager;
}
布局titleView和contentView
// 单独设置titleView的frame
self.navigationItem.titleView = self.pageViewManager.titleView;
self.pageViewManager.titleView.frame = CGRectMake(0, 0, 180, 44);
// 单独设置contentView的大小和位置,可以使用autolayout或者frame
DNSPageContentView *contentView = self.pageViewManager.contentView;
[self.view addSubview:contentView];
[contentView makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
DNSPageStyle中提供了常见样式的属性,可以按照不同的需求进行设置,包括可以设置初始显示的页面
DNSPageView提供了常见事件监听的代理,它属于DNSPageTitleViewDelegate的中的属性
/**
DNSPageView的事件回调,如果有需要,请让对应的childViewController遵守这个协议
*/
@protocol DNSPageEventHandlerDelegate <NSObject>
@optional
/**
重复点击pageTitleView后调用
*/
- (void)titleViewDidSelectSameTitle;
/**
pageContentView的上一页消失的时候,上一页对应的controller调用
*/
- (void)contentViewDidDisappear;
/**
pageContentView滚动停止的时候,当前页对应的controller调用
*/
- (void)contentViewDidEndScroll;
@end
style.isTitleViewScrollEnabled
如果标签比较少,建议设置style.titleViewScrollEnabled = NO
,titleView
会固定,style.titleMargin
不起作用,每个标签平分整个titleView
的宽度,下划线的宽度等于标签的宽度。
如果标签比较多,建议设置style.titleViewScrollEnabled = YES
,titleView
会滑动,下划线的宽度随着标签文字的宽度变化而变化
标签下划线的宽度跟随文字的宽度
设置style.titleViewScrollEnabled = YES
,可以参考demo中的第四种样式。
由于DNSPageView
是基于UIScrollView
实现,那么就无法避免它的一些特性:
UINavigationController
管理,且navigationBar.isTranslucent = YES
的时候,当前控制器的view
是从y = 0
开始布局的,所以为了防止部分内容被navigationBar
遮挡,系统默认会给UIScrollView
添加offset。如果想取消这个特性:
self.automaticallyAdjustsScrollViewInsets = NO
SafeArea
概念,设置UIScrollView
的属性contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever
UIViewController
的其他属性有关系,但因为各种组合的情景过于复杂,所以不在此一一描述DNSPageContentView
用UICollectionView
实现,所以这个特性有机会造成UICollectionView
的高度小于它的item
的高度,造成奇怪的Bug。Demo
不能覆盖所有的场景,不同的布局需求可能会引起不同的Bug,开发者需要明确了解自己的布局需求,注意细节,了解iOS布局特性,并且作出对应的调整,不能完全参照Demo
。DNSPageView-ObjC is available under the MIT license. See the LICENSE file for more info.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。