iOS tips 7

URL Scheme和正则表达式

2016-01-15 | 阅读

UITableViewCell中嵌套UIScrollView

简单来说,UIScrollview不能用自动布局,要用frame来设置位置.自动布局下无法自动设置contentSize,所以无法自动滑动.如果使用自动布局,但是自行设置contentSize还是能滑动的.

URLScheme

注册自定义URL Scheme:

  1. 在info.plist添加URL types的Array,然后 反转域名.
  2. URL types下为item 0,第一个属性默认为URL Identifier,设置值为bundle id .
  3. item 0下,再添加URL Schemes的Array.
  4. URL Schemes下就可以添加自定义的URL Scheme了,设置名字,但是不需要在后面添加://.如添加一个testMyURLScheme.

这样就注册了URLScheme,安装应用后,打开浏览器,输出 testMyURLScheme://,就会自动跳转到自己的应用中.

然后在函数 :

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation ;

中来处理外部URLScheme的唤起,如正常的URL一样,这里也是可以添加参数的.

OC中的正则表达式

正则表达式类 为NSRegularExpression.正则表达式一般用做匹配或者替换,匹配来进行格式的验证或者搜索,而替换就可以在搜索的结果下进行字符串的替换.

初始化一个正则表达式:

+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;

两个方法相似,对于枚举类型 NSRegularExpressionOptions:

typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
   NSRegularExpressionCaseInsensitive             = 1 << 0, //不区分字母大小写
   NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1, //忽略掉正则表达式中的空格和#号之后的字符
   NSRegularExpressionIgnoreMetacharacters        = 1 << 2, //将正则表达式整体作为字符串处理,即忽略正则表达式的格式化字符
   NSRegularExpressionDotMatchesLineSeparators    = 1 << 3, //允许.匹配任何字符,包括换行符  
   NSRegularExpressionAnchorsMatchLines           = 1 << 4, //允许^和$符号匹配行的开头和结尾
   NSRegularExpressionUseUnixLineSeparators       = 1 << 5, //设置\n为唯一的行分隔符,否则所有的都有效。
   NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6 //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
};

使用回调来处理正则表达式的匹配:

- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult * __nullable result, NSMatchingFlags flags, BOOL *stop))block;

一般使用回调,会是在大段文字的搜索中使用到.这里又有两个枚举类型:

typedef NS_OPTIONS(NSUInteger, NSMatchingOptions) {
   NSMatchingReportProgress         = 1 << 0, //找到最长的匹配字符串后调用block回调
   NSMatchingReportCompletion       = 1 << 1, //找到任何一个匹配串后都回调一次block
   NSMatchingAnchored               = 1 << 2, //在range指定的范围内进行匹配.
   NSMatchingWithTransparentBounds  = 1 << 3, //允许匹配的范围超出设置的范围
   NSMatchingWithoutAnchoringBounds = 1 << 4  //禁止^和$
};

typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) {
   NSMatchingProgress               = 1 << 0, //匹配到最长串     
   NSMatchingCompleted              = 1 << 1, //全部分配完成   
   NSMatchingHitEnd                 = 1 << 2, //匹配到设置范围的末尾   
   NSMatchingRequiredEnd            = 1 << 3, //当前匹配到的字符串在匹配范围的末尾时    
   NSMatchingInternalError          = 1 << 4  //由于错误导致的匹配失败   
};

不适用回调还有四个同步的匹配函数 :

// 返回匹配得到的数组
- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

//返回匹配到得字符串的个数
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

//返回第一个查询到得结果,这个NSTextCheckingResult对象中有一个range属性,可以得到匹配到的字符串的范围。
- (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

//返回匹配到得范围,NSRange。
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

这里也使用到了枚举类型NSMatchingOptions,但是并没有任何作用,一般设置0就可以了.

UITableView需要注意的地方

一般间隔使用Header,header会在滑动时停留在顶部.而footer会在上滑时停留在底部,要想关闭停留,可以在创建tableview时设置Style 为:UITableViewStyleGrouped

UILabel 自适应高度

一段文字放在UILabel中,其长度应该是多少,如果自动换行,那行数是多少,高度是多少,这是很重要的,NSString提供一个API:

// 给定内容字体宽度来计算高度.
- (CGRect)boundingRectWithSize:(CGSize)size // UILabel的范围,一般计算高度,要给定宽度
                    options:(NSStringDrawingOptions)options 
                 attributes:(nullable NSDictionary<NSString *, id> *)attributes // 字体的颜色等属性.
                    context:(nullable NSStringDrawingContext *)context;

对于NSStringDrawingOptions,有:

//如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号
NSStringDrawingTruncatesLastVisibleLine=1<<5,

//绘制文本时使用 line fragement origin 而不是 baseline origin。,大概意思是计算多行的高度,而表示计算一行的的长度.
NSStringDrawingUsesLineFragmentOrigin=1<<0,

//计算行高时使用行距。(译者注:字体大小+行间距=行距)
NSStringDrawingUsesFontLeading=1<<1,

//计算布局时使用图元字形(而不是印刷字体)。
NSStringDrawingUsesDeviceMetrics=1<<3,