Bootstrap

常用开发技巧系列(六)

一: 关于UIColor 自己在平时的工作中用到几个比较好的UIColor的类别,分享出来:

      1、 UIColor 初始化关于 Hex (16进制的可以的)  比如我们 #FFFFFF 等怎么初始化一个UIColor,在iOS中是没有直接的方法初始化的,所以很多时候安卓同学用16进制的iOS的还要RGB就会很麻烦,下面是根据两个类别方法,OC版本的:

+ (UIColor *)colorWithRGBHex:(UInt32)hex
{
	int r = (hex >> 16) & 0xFF;
	int g = (hex >> 8) & 0xFF;
	int b = (hex) & 0xFF;
	
	return [UIColor colorWithRed:r / 255.0f
						   green:g / 255.0f
							blue:b / 255.0f
						   alpha:1.0f];
}

+ (UIColor *)colorWithHexString:(NSString *)stringToConvert{
    
    NSString *cString = [[stringToConvert stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    
    // String should be 6 or 8 characters
    if ([cString length] < 6) {
        return [UIColor clearColor];
    }
    
    // strip 0X if it appears
    if ([cString hasPrefix:@"0X"])
        cString = [cString substringFromIndex:2];
    if ([cString hasPrefix:@"#"])
        cString = [cString substringFromIndex:1];
    if ([cString length] != 6)
        return [UIColor clearColor];

	NSScanner *scanner = [NSScanner scannerWithString:cString];
	unsigned hexNum;
	if (![scanner scanHexInt:&hexNum]) return nil;
	return [UIColor colorWithRGBHex:hexNum];
}

      简单的使用如下:

self.backgroundColor = [UIColor colorWithHexString:@"#F1F1F1"];

label.textColor = [UIColor colorWithRGBHex:0x707070];

      2、Swift 版本的:

/// 自定义初始化方法
///
/// - Parameters:
///   - r: red
///   - g: green
///   - b: blue
///   - a: alpha
convenience init(r:UInt32 ,g:UInt32 , b:UInt32 , a:CGFloat = 1.0) {
    self.init(red: CGFloat(r) / 255.0,
              green: CGFloat(g) / 255.0,
              blue: CGFloat(b) / 255.0,
              alpha: a)
}
    
/// 自定义初始化方法
///
/// - Parameters:
///   - hexString: 6位字符 'F1F1F1'
///   - alpha: 透明度值 0.0-1.0
convenience init(hexString: String, alpha:CGFloat = 1.0) {
        
   var r: UInt32 = 0x0
   var g: UInt32 = 0x0
   var b: UInt32 = 0x0
        
   var cString: String = hexString.trimmingCharacters(in: .whitespacesAndNewlines)
   if cString.count < 6 {
        self.init(red: CGFloat(r) / 255.0,
                  green: CGFloat(g) / 255.0,
                  blue: CGFloat(b) / 255.0,
                  alpha: alpha)
        return
    }
        
    let index = cString.index(cString.endIndex, offsetBy: -6)
    let subString = cString[index...]
    if cString.hasPrefix("0X") { cString = String(subString) }
    if cString.hasPrefix("#") { cString = String(subString) }
        
    if cString.count != 6 {
        self.init(red: CGFloat(r) / 255.0,
                  green: CGFloat(g) / 255.0,
                  blue: CGFloat(b) / 255.0,
                  alpha: alpha)
        return
    }
        
    var range: NSRange = NSMakeRange(0, 2)
    let rString = (cString as NSString).substring(with: range)
    range.location = 2
    let gString = (cString as NSString).substring(with: range)
    range.location = 4
    let bString = (cString as NSString).substring(with: range)
        
    Scanner(string: rString).scanHexInt32(&r)
    Scanner(string: gString).scanHexInt32(&g)
    Scanner(string: bString).scanHexInt32(&b)
        
    self.init(red: CGFloat(r) / 255.0,
               green: CGFloat(g) / 255.0,
               blue: CGFloat(b) / 255.0,
               alpha: alpha)
}

      它的使用也是很简单的如下:

self.backgroundColor = UIColor.init(hexString: "F9F9F9")

       3、在给一个单色取RGB的UIColor类别方法 OC版本的 Swift的有需要可以自己尝试着写一下哈:

// 颜色模式
- (CGColorSpaceModel)colorSpaceModel {

	return CGColorSpaceGetModel(CGColorGetColorSpace(self.CGColor));
}


- (NSString *)colorSpaceString {

	switch (self.colorSpaceModel) {

		case kCGColorSpaceModelUnknown:
			return @"kCGColorSpaceModelUnknown";
		case kCGColorSpaceModelMonochrome:
			return @"kCGColorSpaceModelMonochrome";
		case kCGColorSpaceModelRGB:
			return @"kCGColorSpaceModelRGB";
		case kCGColorSpaceModelCMYK:
			return @"kCGColorSpaceModelCMYK";
		case kCGColorSpaceModelLab:
			return @"kCGColorSpaceModelLab";
		case kCGColorSpaceModelDeviceN:
			return @"kCGColorSpaceModelDeviceN";
		case kCGColorSpaceModelIndexed:
			return @"kCGColorSpaceModelIndexed";
		case kCGColorSpaceModelPattern:
			return @"kCGColorSpaceModelPattern";
		default:
			return @"Not a valid color space";
	}
}

// 判断能不能取
- (BOOL)canProvideRGBComponents {
	switch (self.colorSpaceModel) {
		case kCGColorSpaceModelRGB:
		case kCGColorSpaceModelMonochrome:
			return YES;
		default:
			return NO;
	}
}


// 只有单色能取出RGB,要不是就不能
- (NSArray *)arrayFromRGBAComponents {
	NSAssert(self.canProvideRGBComponents, @"Must be an RGB color to use -arrayFromRGBAComponents");

	CGFloat r,g,b,a;
	if (![self red:&r green:&g blue:&b alpha:&a]) return nil;
	
	return  [NSArray arrayWithObjects:
			[NSNumber numberWithFloat:r],
			[NSNumber numberWithFloat:g],
			[NSNumber numberWithFloat:b],
			[NSNumber numberWithFloat:a],
			nil];
}

 

二:这个Xcode错误

error: Cycle inside ****(这里是你项目的名称); building could produce unreliable results. This usually can be resolved by moving the shell script phase 'h' so that it runs before the build phase that depends on its outputs.

Cycle details:

→ That command depends on command in Target '****': script phase “[CP] Copy Pods Resources”

○ That command depends on command in Target '****': script phase “[CP] Copy Pods Resources”

 

Xcode10和Xcode9的不同引发的问题,具体的解决办法下面的文章说的比较清楚,我自己修改的时候是按下面图所示:

 

修改了Build Systen 为 Legacy Build System 不用Xcode的 Default模式      解决办法:升级Xcode10问题集

 

三:关于苹果开发者账号的支付问题

      单标卡到底能不能用这个东西我以前也没有确认过,不过最近通过官方渠道确认了一下,在购买开发者账号的时候我们可以看到支付类型就一个visa或者MasterCard两种,然后我们就会找带这两个标识的信用卡来支付,然后有些成功了有些会遇到支付失败的问题,其实就是这个单标双标的问题或者有没有开通国际支付功能引起的,还有网上有些可以使用苹果支付的完全是没有根据的,下面这两张聊天的截图可以把这个问题说清楚:

 

                                 

 

 四:  iOS 清楚.(点)和->(箭头)的区别

      这两个访问方式在看一下第三方库代码的时候应该会经常遇到的,在这里做一个区分记录:

      1、.(点语法)是访问类的属性,本质是调用set、get方法。

      2、->是访问成员变量,但成员变量默认受保护,所以常常报错,手动设为public即可解决

 

五:  Swift版本的CGD定时器

      经常用经常忘记怎么写的我还得经常去查找,记录在这里方便自己查找

/// 测试
var timeCount = 0
let  timer =  DispatchSource.makeTimerSource(queue: DispatchQueue.global())
timer.schedule(deadline: .now(), repeating: .seconds(2))
/// 设定时间源的触发事件
timer.setEventHandler(handler: {
               
      timeCount += 1
      if timeCount == 200 {
          timer.cancel()
      }
      print("--------------",timeCount)
      // 返回主线程处理一些事件,更新UI等等
      DispatchQueue.main.async {
         
      }
})
/// 启动时间源
timer.resume()

 

六:Git 报错了  You won't be able to pull or push project code via SSH until you add an SSH (在您的配置文件中添加一个ssh密钥之前,您将无法通过ssh来拖动或推动项目代码)

      这个问题就是SSH配置的问题,具体的解决办法就是你配置好本地的SSH然后把它填写到Gitlab就可以了,具体的按下面走:

      1、cd ~/.ssh  进来之后 ls -a  检查一下有没有生成Key (要是没有一个 .pub)的文件那就是没有Key

      2、ssh-keygen -t rsa -C "你公司在GITLAB上的邮箱地址"  生成key (注意下这个冒号 以免 dquote ) 

      3、第一次输入文件名   第二次输入密码    第三次确认密码   OK  

      4、 cat   你输入的文件名.pub  (查看这个pub文件)  

      5、粘贴复制你需要的key  (全部复制包括 ssh 开头信息)

 

七:Git fatal: Authentication failed for '你的项目git地址'

      这时候一般不要怀疑就是权限出问题了  In a case you entered incorrect password, please update it in Keychain Acces  要是出现这个那就是账号密码有问题

      当你账号密码有问题的时候你你可以这样解决

      1、你要是已经clone下来了, cd 到你的项目下面,按下面所示

 

       2、你要有别的正常的项目你可以进来看一下这个地方怎么写的,一般都是   url = http:// 账号:密码@你的账目地址  然后保存退出再试试

       3、你要是没有colne下来项目,直接这样报错了,那你其实可以  git config --system --unset credential.helper 从新填写账号密码 也可以

       4、当然你也可以直接创建一个文件之后进入到文件夹下面 直接 git clone 项目地址