iOS整个APP实现灰色主题的示例代码

灰色主题

背景

在一些哀悼日,清明节的时候app会实现一些灰色主题功能,部分app需求是tab首页实现灰色模式就可以,但一些需求是直接整个app都变为灰色模。

  • 普通UI界面
  • web页面
  • xib界面
  • attributeText加载的htmlString页面
  • attachment挂件页面

实现方式

基本的实现方式1,普通页面用hook颜色方式2.web页面用注入灰色js实现方式

图片变灰

重新绘制图片变为灰色代码实现

//image类别
- (UIImage *)getGrayImage {

  const int RED =1;
  const int GREEN =2;
  const int BLUE =3;

  UIImage *image = self;

  // Create image rectangle with current image width/height
  CGRect imageRect = CGRectMake(0,0, image.size.width* image.scale, image.size.height* image.scale);

  int width = imageRect.size.width;
  int height = imageRect.size.height;

  // the pixels will be painted to this array
  uint32_t *pixels = (uint32_t*) malloc(width * height *sizeof(uint32_t));

  // clear the pixels so any transparency is preserved
  memset(pixels,0, width * height *sizeof(uint32_t));

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

  // create a context with RGBA pixels
  CGContextRef context = CGBitmapContextCreate(pixels, width, height,8, width *sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

  // paint the bitmap to our context which will fill in the pixels array
  CGContextDrawImage(context,CGRectMake(0,0, width, height), [image CGImage]);

  for(int y = 0; y < height; y++) {
    for(int x = 0; x < width; x++) {
      uint8_t *rgbaPixel = (uint8_t*) &pixels[y * width + x];

      // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
      uint32_t gray = 0.3 * rgbaPixel[RED] +0.59 * rgbaPixel[GREEN] +0.11 * rgbaPixel[BLUE];

      // set the pixels to gray
      rgbaPixel[RED] = gray;
      rgbaPixel[GREEN] = gray;
      rgbaPixel[BLUE] = gray;
    }
  }

  // create a new CGImageRef from our context with the modified pixels
  CGImageRef imageRef = CGBitmapContextCreateImage(context);

  // we're done with the context, color space, and pixels
  CGContextRelease(context);
  CGColorSpaceRelease(colorSpace);
  free(pixels);

  // make a new UIImage to return
  UIImage *resultUIImage = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:UIImageOrientationUp];

  // we're done with image now too
  CGImageRelease(imageRef);

  return resultUIImage;

}

文本变灰

文本textColor变为灰色 rgb的处理有很多这里简单提供一个

    [self swizzleMethod:self orgSel:@selector(initWithRed:green:blue:alpha:) swizzSel:@selector(hdd_initWithRed:green:blue:alpha:)];
+ (UIColor *)hdd_colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)a{
  CGFloat gray = red*0.299 + green*0.587 + blue*0.114;
  if ([CSDarkSiteManager isLocalCacheDarkSiteStatus]) {
    return [self hdd_colorWithRed:gray green:gray blue:gray alpha:a];
  }
  else {
    return [self hdd_colorWithRed:red green:green blue:blue alpha:a];
  }
}

文本变灰色还牵扯到系统颜色的灰色处理,例如[UIcolor whiteColor],系统alertView弹框中的蓝色按钮颜色处理,都需要有专门的处理方法

xib图片变灰

由于xib读取图片不是直接通过[UIimageView imageName:@""] 加载方式 没办法直接通过hook setImage直接设置xib图片变为灰色

方法:重写UIimageView的awakeFromNib,再去执行hook setImage的方法进行加载

webView的变灰

hook webView的初始化方法,注入js灰色

+ (void)swizzHook {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    Method originalMethod = class_getInstanceMethod([self class], @selector(initWithFrame:configuration:));
    Method swizzledMethod = class_getInstanceMethod([self class], @selector(lg_initWithFrame:configuration:));
    method_exchangeImplementations(originalMethod, swizzledMethod);
  });
}
- (instancetype)lg_initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration {
  Class class = NSClassFromString(@"AIRWKWebView");
  if ([CSDarkSiteManager isLocalCacheDarkSiteStatus] && ![self isKindOfClass:class]) {
    NSString *jScript = @"var filter = '-webkit-filter:grayscale(100%);-moz-filter:grayscale(100%); -ms-filter:grayscale(100%); -o-filter:grayscale(100%) filter:grayscale(100%);';document.getElementsByTagName('html')[0].style.filter = 'grayscale(100%)';";
    // 注入
    WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:wkUScript];
    WKWebView *webView = [self lg_initWithFrame:frame configuration:configuration];
    return webView;
  }
  else {
    WKWebView *webView = [self lg_initWithFrame:frame configuration:configuration];
    return webView;
  }

}

attributeText加载htmlString变灰

attribute情况下加载html不是直接通过设置color来改变颜色的,需要通过遍历对应的属性进行重新颜色进行赋值

存在的问题

这样全局修改,可能会把键盘的颜色也改变了需要特殊处理

系统颜色中,alertView中的蓝色,不在定义的系统颜色范围之内需要重新加载

hook系统颜色的处理

完整性

需要完整的私发信息

到此这篇关于iOS整个APP实现灰色主题的示例代码的文章就介绍到这了,更多相关iOS 灰色主题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一步一步实现iOS主题皮肤切换效果

    本文实例为大家分享了iOS主题皮肤切换代码,供大家参考,具体内容如下 1. 主题皮肤功能切换介绍 主题切换就是根据用户设置不同的主题,来动态改变用户的界面,通常会改变navigationBar背景图片.tabBar背景图片.tabBar中的按钮的图片和选中的背景图片.navigationItem.title 标题的字体颜色.UI中其他元素控件 下载源代码地址: http://xiazai.jb51.net/201609/yuanma/ThemeSkinSetup(jb51.net).rar 2.

  • iOS开发之App主题切换解决方案完整版(Swift版)

    本篇博客就来介绍一下iOS App中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了.本篇博客中所涉及的Demo完全使用Swift3.0编写完成,并使用iOS的NSNotification来触发主题切换的动作.本篇博客我们先对我们的主题系统进行设计,然后给出具体实现方式.当然在我们设计本篇博客所涉及的Demo时,我们要遵循"高内聚,低耦合","面向接口编程","便于维护与扩充"等特点. 本篇博

  • iOS整个APP实现灰色主题的示例代码

    灰色主题 背景 在一些哀悼日,清明节的时候app会实现一些灰色主题功能,部分app需求是tab首页实现灰色模式就可以,但一些需求是直接整个app都变为灰色模. 普通UI界面 web页面 xib界面 attributeText加载的htmlString页面 attachment挂件页面 实现方式 基本的实现方式1,普通页面用hook颜色方式2.web页面用注入灰色js实现方式 图片变灰 重新绘制图片变为灰色代码实现 //image类别 - (UIImage *)getGrayImage { con

  • Flutter 实现整个App变为灰色的方法示例

    在Flutter中实现整个App变为灰色是非常简单的,只需要在最外层的控件上包裹ColorFiltered,用法如下: @override Widget build(BuildContext context) { return ColorFiltered( colorFilter: ColorFilter.mode(Colors.grey, BlendMode.color), child: Scaffold( appBar: _appBar, body: IndexedStack( index:

  • IOS获取系统相册中照片的示例代码

    先来看看效果图 下面话不多少,我们直接上代码: #import "ViewController.h" @interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate> @property (weak, nonatomic) IBOutlet UIImageView *IconView; @end @implementation ViewController

  • Matlab实现灰色预测的示例代码

    目录 模型介绍 基础代码 基础代码+修饰 模型介绍 略微带过一下原理: 灰色预测对于趋势不强的数据,将其原始数据进行累加后得到具有明显趋势的新数据进行拟合,假设原数据为: 则新数据集X(1)中数据为: 通常认为累加数据服从指数分布,欸那我们直接假设: 直接进行一个非线性拟合不就完事了,但是,从小学二年级开始,老师就教导我们,像这用指数函数拟合啊,各个参数的变化对于整体曲线的影响效果差别很大啊,直接拟合误差会很大啊,怎么能给他整成一个线性拟合啊?(直接拟合我有试过,能够大体描述趋势并做出预测,但是

  • iOS如何跳转到App Store下载评分页面示例代码

    前言 目前很多应用是要求点击事件直接跳转到App Store,最近工作中就遇到了一个跳转 App Store 评分或者下载更新的功能,网上查到很多跳转方法,这里记录一下,下面话不多说了,来一起看看详细的介绍吧. 主要跳转方法有两种 使用官方 StoreKit.framework 框架 应用间跳转直接跳到 App Store 应用,并携带自己 App 的 AppID. 使用官方框架 苹果提供了StoreKit.framework框架,工程中可以导入这个框架的主头文件 #import <StoreK

  • iOS实现实时检测网络状态的示例代码

    前言 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验 WIFI\3G网络:自动下载高清图片 低速网络:只下载缩略图 没有网络:只显示离线的缓存数据 最近在工作中遇到一个功能就是根据用户当前的网络状,用户未联网需要提示一下,如果是Wifi可以推荐一些图片新闻,如果是3G模式设置为无图的模式,获取网络状态比较简单,毕竟中国现在的流量还是一个比较贵的状态,

  • 判断iOS、Android以及PC端的示例代码

    前言 我们在做移动端时,在跨平台.浏览器.移动设备兼容的时候,要根据设备.浏览器做特定调整,想起用navigator.userAgent来对浏览器类型进行判断,查了点资料,在这里总结下 还有一个就是移动端的缩放问题,在meta标签中进行设置,对部分浏览器进行强制性的限制 1.navigator的一些常用属性 navigator为window对象的一个属性,指向了一个包含浏览器相关信息的对象 navigator.appVersion 浏览器的版本号 navigator.language 浏览器使用

  • iOS状态栏的显示与隐藏的示例代码

    今天设计师跑来问iOS状态栏的问题,由于之前没有整理,只能"我确认下给你回复",确认得有点久,略尴尬...好记性不如烂笔头,希望能养成整理做笔记的好习惯.那么,闲话少说, 让我们进入正题. 我们使用xcode新建一个 iOS工程 ,默认情况下状态栏是显示的. 隐藏某个控制器的状态栏 最简单地隐藏方法就是使用下面这段代码: - (BOOL)prefersStatusBarHidden { returnYES; } 全局隐藏状态栏 上面代码确实隐藏了对应控制器的状态栏,但是多数情况下我们的

  • android 获取本机其他app的版本信息的示例代码

    我们公司过一个测速的插件,我需要去被另一个app升级,这里就会有一个问题,就是如何去获取本机其他app的版本信息呢,后面我会写一篇app自动升级的文章. 我们先建一个实体类,用来存放app信息. package com.zznode.bean; import android.graphics.drawable.Drawable; import android.util.Log; /** * Created by 杰梵 on 2017/9/25. * 用来存取app的信息. */ public c

  • iOS屏幕旋转与锁屏的示例代码

    在做视频开发时遇到屏幕旋转问题,其中涉及到 StatusBar. UINavigationController.UITabBarController .UIViewcontroller . 在设备锁屏下的整体效果图 iOS-旋转.gif 主要涉及以下4点: 横竖屏的旋转 屏幕旋转相应改变视图位置 旋转时状态栏的隐藏与显示 锁屏 1.横竖屏旋转 第1步: -(UIInterfaceOrientationMask)application:(UIApplication *)application su

随机推荐