海豚社区阶段性开发总结

  1. 图片筛选,加载和显示处理
  2. 手势处理
  3. 字符串处理,字符转义,属性字符串
  4. 时间戳处理
  5. 简易动画效果回顾
  6. 富文本框架推荐FTCoreTextView和FTCoreTextStyle
  7. 其他经验总结

一、图片筛选,加载和显示处理

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()), ^{

});

原文地址:https://www.cnblogs.com/A-Long-Way-Chris/p/4143400.html