海豚社区阶段性开发总结
- 图片筛选,加载和显示处理
- 手势处理
- 字符串处理,字符转义,属性字符串
- 时间戳处理
- 简易动画效果回顾
- 富文本框架推荐FTCoreTextView和FTCoreTextStyle
- 其他经验总结
一、图片筛选,加载和显示处理
1、 加载网络图片,使用了UIImageView+AFNetworking分类的设置方法setImageWithURL。
2、 UIImageView重要方法setContentMode:
setContentMode方法,类型为UIViewContentMode,分为如下几个枚举类型:
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is transparent
UIViewContentModeScaleAspectFill, // contents scaled to fill with fixed aspect. some portion of content may be clipped.
UIViewContentModeRedraw, // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter, // contents remain same size. positioned adjusted.
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
ScaleToFill模式表示充满父容器,当图片内容与容器长宽比例不一致,会出现形变;ScaleAspectFit表示适应容器比例,然后全部展示图片,等比缩放;ScaleAspectFill表示填充容器,不会压缩图片,但是图片可能会超出容器边框,并且不显示超出部分。
3、 UIImageView.layer的重要方法setCornerRadius:
设置一个半径,将显示区域截成一个圆。配合使用的方法还有setMasksToBounds和setBorderWidth之类的方法。
4、 UIImageView.layer的重要方法setShadowOffset:
设置阴影效果的偏移位置,参数为CGSize,x正表示右,y正表示下。
5、 UIImageView可以设置animationImages属性,然后调用startAnimating方法,播放一组图片,形成动画
6、 拉伸图片:有时候,需要让图片自适应宽度或者高度,但是又不能失真,所以需要用到图片拉伸技术。
可以采用UIImage的resizableImageWithCapInsets:resizingMode:方法来实现。第一个参数表示一个矩形区域,该区域外的图片部分不会改变,区域内的部分拉伸填充。第二个参数表示模式:拉伸还是平铺。
需要特别注意的一点:在高清屏中,图片需要采用@2x命名模式,否则图片会被拉伸变形。
二、手势
UIGestureRcognizer类为手势父类,具有手势状态,委托协议等属性。手势状态主要分为began,changed,ended,cancelled,failed等。可以设置和获取手势最少需要的触摸点数量、有效时间触摸次数。
作为更常用和便捷的子类,有如下几种:
UITapGestureRecognizer,表示点击手势
UIPinchGestureRecognizer,表示捏合手势
UIPanGestureRecognizer,表示拖动手势
UISwapGestureRecognizer,表示扫动手势
UIRotateGestureRecognizer,表示旋转手势
多采用initWithTarget:action:初始方法,动作为selector指定方法。然后通过目标view的addGestureRecognizer方法添加手势。代理方法可不实现。
点击tap手势中,可能会遇到单击和双击共存的情况。此时需要作一个过滤处理,先处理多击手势。方法为:
[singletapGest requireGestureRecognizerToFail:doubleTapGest];
三、字符串处理
之前遇到比较多的字符串处理工作,在此总结下重要的内容。
1、对字符串进行md5加密:
使用前,添加引用#import <CommonCrypto/CommonDigest.h>
+ (NSString *)md5HexDigest:(NSString *)input
{
if (0 == input.length) {
return nil;
}
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, strlen(str), result);
NSMutableString *ret
= [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];//
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
2、计算字符串的size:
[text boundingRectWithSize:CGSizeMake(width, 0) options:
NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading attributes:attribute context:nil]
此处用到了attributes,类型为描述字符串属性特征的NSDictionary。如下例子:
NSDictionary* attributeDic = @{NSParagraphStyleAttributeName : paragraphStyle, NSKernAttributeName : [NSNumber numberWithFloat:2.0f], NSFontAttributeName : FONT(DETAILVIEWTEXTSIZE), NSForegroundColorAttributeName : REPLYCONTENTCOLOR};
上例中,又涉及了几个类型:
NSParagraphStyleAttributeName表示段落样式属性。
NSMutableParagraphStyle* paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.maximumLineHeight = PERLINEHEIGHT;
paragraphStyle.minimumLineHeight = PERLINEHEIGHT;
paragraphStyle.lineSpacing = PERLINEADDEDHEIGHT;
paragraphStyle.paragraphSpacing = PARAGRAPHINSETHEIGHT;
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
上面是对段落样式的详细设置。
NSKernAttributeName表示字体间距,注意为NSNumber类型
后面两个分别为字体类型和字体颜色。
四、时间戳处理
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
设置默认当地时区
[formatter setTimeZone:[NSTimeZone defaultTimeZone]];
设置时间格式
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
可以自定义时间格式,类似如下
[formatter setDateFormat:@"yyyy-MM-dd 23:59:59"];
五、动画效果
主要运用了UIView的动画block方法:
+ (void)transitionWithView:(UIView *)view
duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion
设置动画所在的UIView或者为nil,动画周期,动画类型,动画具体内容,动画完成后后的内容。
六、富文本控件研究
FTCoreTextView和FTCoreTextStyle的研究
目前这个框架使用在搜索模块中,用于显示命中的关键词。
用法:
首先采用如下方法实例化FTCoreTextView
[[FTCoreTextView alloc]
initWithFrame:CGRectMake(TABLEVIEWCELLHORIZONOFFSET, TABLEVIEWSECTIONTOPEDGE1, SCREEN_WIDTH - TABLEVIEWCELLHORIZONOFFSET * 2, 23)];
然后添加FTCoreTextStyle对象addStyle
FTCoreTextStyle *nameStyle = [[FTCoreTextStyle alloc] init];
nameStyle.font = FONTBOLD(12);
nameStyle.color = COLOR(108, 96, 84, 1.0);
nameStyle.textAlignment = FTCoreTextAlignementLeft;
[self.postName addStyle:nameStyle];
该框架还是比较强大的,可以自定义类似xml标签,来定义对应的文字样式,还可以这是段落间距和行间距,但唯一不能调整字体间距。所以为了调整字体间距,采用了字体属性样式字符串来显示,这又导致不能兼容xml标签的显示效果,故没有在帖子详情使用该框架。
七、其他经验总结
1、 采用ARC方式管理内容,需要在controller退出时候,就将带有subView的UIView上的所有子view全部移除,并且将变量和属性置为nil
2、 将一个对象加入一个数组以后,就可以及时置为nil了
3、 UIImageView只能显示静态图和图片数组,不能显示jif格式图片
4、 tableHeaderView和tableFooterView需要先实例化,才能添加view
5、 最好将用于更新界面的操作放在如下块内
dispatch_async(dispatch_get_main_queue()), ^{
});
6、 NSTimer的类方法,已经启动了计时器,不需要再调用实例方法fire,可能会引起冲突。不使用时,需要调用invalidate停掉计时器,最好最后将对象置为nil。
7、 最好将用于更新界面的操作放在如下块内
dispatch_async(dispatch_get_main_queue()), ^{
});