iOS开发--仿新闻首页效果WMPageController的使用详解

这一篇记录的是iOS开发中第三方库WMPageController控件的使用方法,主要是用来分页显示内容的,可以通过手势滑动来切换页面,也可以通过点击标题部分来切换页面,如下图所示:

使用方法:

新建工程DemoTest1,然后通过cocoapods引入WMPageController到项目中,Podfile文件的内容如下:

platform :ios,'7.0'

target 'DemoTest1' do

 pod 'WMPageController', '~> 1.6.4'

end

方法一:

(1)创建几个ViewController继承自UIViewController测试用:

(2)打开AppDelegate.m文件,在其中加入下面一个方法:

#import "WMPageController.h"

#import "OneViewController.h"
#import "ViewController.h"
#import "TwoViewController.h"

@interface AppDelegate ()

@property(nonatomic,strong) WMPageController *createPages;

@end

@implementation AppDelegate

- (WMPageController *)createPages {

  //WMPageController中包含的页面数组
  NSArray *controllers = [NSArray arrayWithObjects:[ViewController class], [OneViewController class],[TwoViewController class], nil];
  //WMPageController控件的标题数组
  NSArray *titles = [NSArray arrayWithObjects:@"体育新闻", @"娱乐新闻",@"直播新闻", nil];
  //用上面两个数组初始化WMPageController对象
  WMPageController *pageController = [[WMPageController alloc] initWithViewControllerClasses:controllers andTheirTitles:titles];
  pageController.menuViewStyle = WMMenuViewStyleLine;
  pageController.titleColorSelected = [UIColor whiteColor];
  pageController.titleColorNormal = [UIColor colorWithRed:168.0/255.0 green:20.0/255.0 blue:4/255.0 alpha:1];
  pageController.progressColor = [UIColor colorWithRed:168.0/255.0 green:20.0/255.0 blue:4/255.0 alpha:1];
  //  pageController.itemsWidths = @[@(70),@(100),@(70)]; // 这里可以设置不同的宽度

  //设置WMPageController每个标题的宽度
  pageController.menuItemWidth = 375/3;
  //设置WMPageController标题栏的高度
  pageController.menuHeight = 35;
  //设置WMPageController选中的标题的颜色
  pageController.titleColorSelected = [UIColor colorWithRed:200 green:0 blue:0 alpha:1];
  return pageController;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

  WMPageController *page = [self createPages];

  UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:page];

  self.window.rootViewController = na;

  [self.window makeKeyAndVisible];

  return YES;
}

方法二:

(1)创建个ViewController继承自WMPageController

(2)编辑ViewController.m文件,代码如下:

初始化设置:

#import "TwoViewController.h"
#import "OneViewController.h"
#import "TableViewController.h"

#import "ThreeViewController.h"

@interface ThreeViewController () 

@property (nonatomic, strong) NSArray *titleData;
@end

@implementation ThreeViewController

#pragma mark 标题数组
- (NSArray *)titleData {
  if (!_titleData) {
    _titleData = @[@"单曲", @"详情", @"歌词",@"歌词"];
  }
  return _titleData;
}
#pragma mark 初始化代码
- (instancetype)init {
  if (self = [super init]) {

    self.titleSizeNormal = 15;
    self.titleSizeSelected = 15;
    self.menuViewStyle = WMMenuViewStyleLine;
    self.menuItemWidth = [UIScreen mainScreen].bounds.size.width / self.titleData.count;
    self.menuHeight = 50;
  }
  return self;
}

WMPageController --Datasource & Delegate

#pragma mark - Datasource & Delegate

#pragma mark 返回子页面的个数
- (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController {
  return self.titleData.count;
}

#pragma mark 返回某个index对应的页面
- (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index {

  switch (index) {
      case 0:{

        TwoViewController  *vcClass = [[TwoViewController alloc] init];
        vcClass.title = @"1";

        return vcClass;
      }

        break;
      case 1:{

        OneViewController *vcClass = [OneViewController new];
        vcClass.title = @"2";
        return vcClass;

      }
        break;
      case 2:{

        TableViewController *vcClass = [TableViewController new];
        vcClass.title = @"3";
        return vcClass;

      }
        break;

      default:{

        OneViewController *vcClass = [OneViewController new];
        vcClass.title = @"4";
        return vcClass;

      }

        break;
    }

}

#pragma mark 返回index对应的标题
- (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index {

  return self.titleData[index];
}

相关设置:

/**
 * Values and keys can set properties when initialize child controlelr (it's KVC)
 * values keys 属性可以用于初始化控制器的时候为控制器传值(利用 KVC 来设置)
  使用时请确保 key 与控制器的属性名字一致!!(例如:控制器有需要设置的属性 type,那么 keys 所放的就是字符串 @"type")
 */
@property (nonatomic, strong) NSMutableArray<id> *values;
@property (nonatomic, strong) NSMutableArray<NSString *> *keys;

/**
 * 各个控制器的 class, 例如:[UITableViewController class]
 * Each controller's class, example:[UITableViewController class]
 */
@property (nonatomic, copy) NSArray<Class> *viewControllerClasses;

/**
 * 各个控制器标题
 * Titles of view controllers in page controller.
 */
@property (nonatomic, copy) NSArray<NSString *> *titles;
@property (nonatomic, strong, readonly) UIViewController *currentViewController;

/**
 * 设置选中几号 item
 * To select item at index
 */
@property (nonatomic, assign) int selectIndex;

/**
 * 点击相邻的 MenuItem 是否触发翻页动画 (当当前选中与点击Item相差大于1是不触发)
 * Whether to animate when press the MenuItem, if distant between the selected and the pressed is larger than 1,never animate.
 */
@property (nonatomic, assign) BOOL pageAnimatable;

/**
 * 选中时的标题尺寸
 * The title size when selected (animatable)
 */
@property (nonatomic, assign) CGFloat titleSizeSelected;

/**
 * 非选中时的标题尺寸
 * The normal title size (animatable)
 */
@property (nonatomic, assign) CGFloat titleSizeNormal;

/**
 * 标题选中时的颜色, 颜色是可动画的.
 * The title color when selected, the color is animatable.
 */
@property (nonatomic, strong) UIColor *titleColorSelected;

/**
 * 标题非选择时的颜色, 颜色是可动画的.
 * The title's normal color, the color is animatable.
 */
@property (nonatomic, strong) UIColor *titleColorNormal;

/**
 * 标题的字体名字
 * The name of title's font
 */
@property (nonatomic, copy) NSString *titleFontName;

/**
 * 导航栏高度
 * The menu view's height
 */
@property (nonatomic, assign) CGFloat menuHeight;

// 当所有item的宽度加起来小于屏幕宽时,PageController会自动帮助排版,添加每个item之间的间隙以填充整个宽度
// When the sum of all the item's width is smaller than the screen's width, pageController will add gap to each item automatically, in order to fill the width.

/**
 * 每个 MenuItem 的宽度
 * The item width,when all are same,use this property
 */
@property (nonatomic, assign) CGFloat menuItemWidth;

/**
 * 各个 MenuItem 的宽度,可不等,数组内为 NSNumber.
 * Each item's width, when they are not all the same, use this property, Put `NSNumber` in this array.
 */
@property (nonatomic, copy) NSArray<NSNumber *> *itemsWidths;

/**
 * 导航栏背景色
 * The background color of menu view
 */
@property (nonatomic, strong) UIColor *menuBGColor;

/**
 * Menu view 的样式,默认为无下划线
 * Menu view's style, now has two different styles, 'Line','default'
 */
@property (nonatomic, assign) WMMenuViewStyle menuViewStyle;

@property (nonatomic, assign) WMMenuViewLayoutMode menuViewLayoutMode;

/**
 * 进度条的颜色,默认和选中颜色一致(如果 style 为 Default,则该属性无用)
 * The progress's color,the default color is same with `titleColorSelected`.If you want to have a different color, set this property.
 */
@property (nonatomic, strong) UIColor *progressColor;

/**
 * 定制进度条在各个 item 下的宽度
 */
@property (nonatomic, strong) NSArray *progressViewWidths;

/// 定制进度条,若每个进度条长度相同,可设置该属性
@property (nonatomic, assign) CGFloat progressWidth;

/// 调皮效果,用于实现腾讯视频新效果,请设置一个较小的 progressWidth
@property (nonatomic, assign) BOOL progressViewIsNaughty;

/**
 * 是否发送在创建控制器或者视图完全展现在用户眼前时通知观察者,默认为不开启,如需利用通知请开启
 * Whether notify observer when finish init or fully displayed to user, the default is NO.
 * See `WMPageConst.h` for more information.
 */
@property (nonatomic, assign) BOOL postNotification;

/**
 * 是否记录 Controller 的位置,并在下次回来的时候回到相应位置,默认为 NO (若当前缓存中存在不会触发)
 * Whether to remember controller's positon if it's a kind of scrollView controller,like UITableViewController,The default value is NO.
 * 比如 `UITabelViewController`, 当然你也可以在自己的控制器中自行设置, 如果将 Controller.view 替换为 scrollView 或者在Controller.view 上添加了一个和自身 bounds 一样的 scrollView 也是OK的
 */
@property (nonatomic, assign) BOOL rememberLocation __deprecated_msg("Because of the cache policy,this property can abondon now.");

/** 缓存的机制,默认为无限制 (如果收到内存警告, 会自动切换) */
@property (nonatomic, assign) WMPageControllerCachePolicy cachePolicy;

/** 预加载机制,在停止滑动的时候预加载 n 页 */
@property (nonatomic, assign) WMPageControllerPreloadPolicy preloadPolicy;

/** Whether ContentView bounces */
@property (nonatomic, assign) BOOL bounces;

/**
 * 是否作为 NavigationBar 的 titleView 展示,默认 NO
 * Whether to show on navigation bar, the default value is `NO`
 */
@property (assign, nonatomic) BOOL showOnNavigationBar;

/**
 * 用代码设置 contentView 的 contentOffset 之前,请设置 startDragging = YES
 * Set startDragging = YES before set contentView.contentOffset = xxx;
 */
@property (nonatomic, assign) BOOL startDragging;

/** 下划线进度条的高度 */
@property (nonatomic, assign) CGFloat progressHeight;

/** WMPageController View' frame */
@property (nonatomic, assign) CGRect viewFrame;

/**
 * Menu view items' margin / make sure it's count is equal to (controllers' count + 1),default is 0
  顶部菜单栏各个 item 的间隙,因为包括头尾两端,所以确保它的数量等于控制器数量 + 1, 默认间隙为 0
 */
@property (nonatomic, copy) NSArray<NSNumber *> *itemsMargins;

/**
 * set itemMargin if all margins are the same, default is 0
  如果各个间隙都想同,设置该属性,默认为 0
 */
@property (nonatomic, assign) CGFloat itemMargin;

/** 顶部 menuView 和 scrollView 之间的间隙 */
@property (nonatomic, assign) CGFloat menuViewBottomSpace;

/** progressView 到 menuView 底部的距离 */
@property (nonatomic, assign) CGFloat progressViewBottomSpace;

/** progressView's cornerRadius */
@property (nonatomic, assign) CGFloat progressViewCornerRadius;
/** 顶部导航栏 */
@property (nonatomic, weak) WMMenuView *menuView;

/** 内部容器 */
@property (nonatomic, weak) WMScrollView *scrollView;

/** MenuView 内部视图与左右的间距 */
@property (nonatomic, assign) CGFloat menuViewContentMargin;

/**
 * 左滑时同时启用其他手势,比如系统左滑、sidemenu左滑。默认 NO
  (会引起一个小问题,第一个和最后一个控制器会变得可以斜滑, 还未解决)
 */
@property (assign, nonatomic) BOOL otherGestureRecognizerSimultaneously;
/**
 * 构造方法,请使用该方法创建控制器. 或者实现数据源方法. /
 * Init method,recommend to use this instead of `-init`. Or you can implement datasource by yourself.
 *
 * @param classes 子控制器的 class,确保数量与 titles 的数量相等
 * @param titles 各个子控制器的标题,用 NSString 描述
 *
 * @return instancetype
 */
- (instancetype)initWithViewControllerClasses:(NSArray<Class> *)classes andTheirTitles:(NSArray<NSString *> *)titles;

/**
 * A method in order to reload MenuView and child view controllers. If you had set `itemsMargins` or `itemsWidths` `values` and `keys` before, make sure you have update them also before you call this method. And most important, PAY ATTENTION TO THE COUNT OF THOSE ARRAY.
  该方法用于重置刷新父控制器,该刷新包括顶部 MenuView 和 childViewControllers.如果之前设置过 `itemsMargins` 和 `itemsWidths` `values` 以及 `keys` 属性,请确保在调用 reload 之前也同时更新了这些属性。并且,最最最重要的,注意数组的个数以防止溢出。
 */
- (void)reloadData;

/**
 * Update designated item's title
  更新指定序号的控制器的标题
 *
 * @param title 新的标题
 * @param index 目标序号
 */
- (void)updateTitle:(NSString *)title atIndex:(NSInteger)index;

/**
 * Update designated item's title and width
  更新指定序号的控制器的标题以及他的宽度
 *
 * @param title 新的标题
 * @param index 目标序号
 * @param width 对应item的新宽度
 */
- (void)updateTitle:(NSString *)title andWidth:(CGFloat)width atIndex:(NSInteger)index;

/** 当 app 即将进入后台接收到的通知 */
- (void)willResignActive:(NSNotification *)notification;
/** 当 app 即将回到前台接收到的通知 */
- (void)willEnterForeground:(NSNotification *)notification;

源码demo:源码下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS开发仿电商类APP首页实例

    现在淘宝,京东应用很广泛,今天就效仿做一个类似电商APP首页的实例. 一.Gif效果图: 二.UI布局: 看下图的层级关系,除去最下方的TabBar,首页其余部分全是用UICollectionView实现:其分两大部分,实现三种功能.上方是父UICollectionView的headerView,在此headerView中添加了两个UICollectionView,分别实现图片无限轮播器和一个横向滑动的功能菜单按钮.然后下面就是父UICollectionView的cell,上下滑动展示商品内容.

  • iOS开发之路--仿网易抽屉效果

    最终效果图: MainStoryBoard示意图: BeyondViewController.h // // BeyondViewController.h // 19_抽屉效果_仿网易 // // Created by beyond on 14-8-1. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> #import "LeftTableViewControllerD

  • iOS模仿电子书首页实现书架布局样式

    本文实现了类似电子书首页,用来展示图书或小说的布局页面,书架列表[iPhone6模拟器],屏幕尺寸还没进行适配,只是做个简单的demo[纯代码实现方式] 实现采用的是UICollectionView和UICollectionViewFlowLayout.关于UICollectionView的详细讲解请参考 一.实现layout的DecorationView // // FWBookShelfDecarationViewCollectionReusableView.h // FWPersonalA

  • iOS开发--仿新闻首页效果WMPageController的使用详解

    这一篇记录的是iOS开发中第三方库WMPageController控件的使用方法,主要是用来分页显示内容的,可以通过手势滑动来切换页面,也可以通过点击标题部分来切换页面,如下图所示: 使用方法: 新建工程DemoTest1,然后通过cocoapods引入WMPageController到项目中,Podfile文件的内容如下: platform :ios,'7.0' target 'DemoTest1' do pod 'WMPageController', '~> 1.6.4' end 方法一:

  • IOS开发之手势响应事件优先级的实例详解

    IOS开发之手势响应事件优先级的实例详解 交互响应事件都是通过手势的操作完成的,如点击.或双击.或长按,这些交互都是在视图中完成的,但是不同的视图可能会有不同的交互,有时候就会出现交互响应事件冲突的情况.这时候就需要处理事件优先级,以便达到想要的效果. 示例场景:一个自定义模式视图view中,有一个列表视图table,同时有一个确定的按钮视图button:在view中有一个单击事件UITapGestureRecognizer,在table中点击每个cell也会有点击事件,同样的button中有个

  • iOS开发微信收款到账语音提醒功能思路详解

    一.背景 为了解决小商户老板们在频繁交易中不方便核对.确认到账的痛点,产品MM提出了新版本需要支持收款到账语音提醒功能.这篇文章总结了开发过程中遇到的坑和一些小技巧. 二.技术方案 后台唤醒App 收款到账语音提醒需要收款方在收到款后,播放一段TTS合成语音播报金额,微信在前台时可以通过模板消息将需要播报的金额带下来,再请求TTS数据并播放,但是app在挂起或者被kill掉的情况下要如何请求语音数据并播放呢? iOS提供了两种方式唤醒处于挂起或已经被kill掉的app.分别是Silent Not

  • IOS开发 支持https请求以及ssl证书配置详解

    IOS开发 支持https请求以及ssl证书配置详解 前言: 众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https 楼主正好近日将http转为https,给还没动手的朋友分享一二 一.证书准备 1.证书转换 在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句 // openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der 这样你就可以得到cer类型的证书了.双击,导入电脑. 2.证书放入工程 1.可以直接把转换好

  • iOS开发实现HTTPS之cer文件的使用详解

    iOS开发中实现支持HTTPS,有两种方法:一是后台那边都处理好了,移动端直接可以使用HTTPS接口,二是后台给移动端一个服务器证书cer 文件,这时我们就需要将cer文件导入到我们的工程中,以下是实现方法 1. 双击证书,这时证书已经添加到了钥匙串中 2. 将cer 文件拖入工程中 3. 如果使用的是AFNetwotking 的话,在代码中添加以下代码 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //证书 AF

  • iOS开发之拦截URL转换成本地路由模块URLRewrite详解

    本文主要给大家介绍了关于iOS拦截URL转换成本地路由模块URLRewrite的相关内容,分享出来供各位iOS开发者们参考学习,下面话不多说了,来一起看看详细的介绍: 需求场景 做过电商App的可能都遇到过这样的需求,在商场首页,各种各样动态的跳转,跳转商品详情.秒杀列表.品牌列表.搜索结果.分类结果页面等等等等.同一个位置,可能今天跳这个商品,明天跳转那个商品,运营配的就是一个web端的URL. 拦截webView里面的URL. 需求分析 拦截各种各样的URL,跳转到指定的原生页面. URL的

  • iOS开发学习之监测程序的崩溃次数详解

    前言 本文主要给大家介绍的是关于iOS如何监测程序崩溃次数的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 在写代码之前,我们先弄明白一个app运行的流程. 程序运行启动时依次调用 1.启动页先运行 2. - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 3. - (void)applicationDidBec

  • IOS开发仿微信消息长按气泡菜单实现效果

    目录 正文 使用方法 导入项目 使用 对比微信实现效果 正文 话不多说,直接上效果图 使用方法 导入项目 代码地址:github.com/shangjie119… 将SJPopMenu文件夹拖入到工程或者使用pod导入工程 pod 'SJPopMenu' 这个组件降低与原工程的耦合度,几乎不需要改动原工程代码. 使用 显示: [[SJPopMenu menu] showBy:xxxxxx] 需实现 SJCustomSelectTextView 里面方法,如果是自定义textView,只需将 SJ

  • IOS开发仿微信右侧弹出视图实现

    IOS开发仿微信右侧弹出视图实现 微信首页的+号,点击之后会弹出一个更多的视图,这个视图如何实现呢? 实现该效果可能需要以下技术要点: 1.图片拉伸,通过拉伸图片的中间的较小区域来保持图片的边上的形状 2.仿射变换,用到仿射变换的缩放,平移和合并,视图动画 3.navigationBar的样式设置 实现效果,如下: 本Demo图片来源微信安装包解压得到的图片 实现代码: // // ViewController.m // appXX-微信更多工具栏 // // Created by MRBean

  • IOS 改变导航栏返回按钮的标题实例详解

    IOS 改变导航栏返回按钮的标题实例详解 前言: 下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方. 新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一级页面的title较长,在进入第二级页面后返回按钮leftButtonItem的title就会变得很长,对NavigationBar空间占用很大,而且不美观,于是使用代码对leftButtonItem的title文本进行修改,无论是设置self.navigationItem.leftBa

随机推荐