项目回顾

一、自定义搜索栏

1、在.m文件中进行初始化

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.size = CGSizeMake(300, 30);
        self.font = [UIFont systemFontOfSize:15];
        self.placeholder = @"请输入查询条件";
        // 提前在Xcode上设置图片中间拉伸
        self.background = [UIImage imageNamed:@"searchbar_textfield_background"];
        
        // 通过init初始化的控件大多都没有尺寸
        self.searchIcon = [[UIImageView alloc] init];
        self.searchIcon.image = [UIImage imageNamed:@"searchbar_textfield_search_icon"];
        // contentMode:default is UIViewContentModeScaleToFill,要设置为UIViewContentModeCenter:使图片居中,防止图片填充整个imageView
        self.searchIcon.contentMode = UIViewContentModeCenter;
        self.searchIcon.size = CGSizeMake(30, 30);
        
        self.leftView = self.searchIcon;
        self.leftViewMode = UITextFieldViewModeAlways;
        self.searchIcon.userInteractionEnabled = YES;
        UITapGestureRecognizer *searchTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(searchClick)];
        [self.searchIcon addGestureRecognizer:searchTap];
        
        self.voiceIcon = [[UIImageView alloc] init];
        self.voiceIcon.image = [UIImage imageNamed:@"navigationbar_pop_highlighted"];
        // contentMode:default is UIViewContentModeScaleToFill,要设置为UIViewContentModeCenter:使图片居中,防止图片填充整个imageView
        self.voiceIcon.contentMode = UIViewContentModeCenter;
        self.voiceIcon.size = CGSizeMake(30, 30);
        
        self.rightView = self.voiceIcon;
        self.rightViewMode = UITextFieldViewModeAlways;
        self.voiceIcon.userInteractionEnabled = YES;
        UITapGestureRecognizer *voiceTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(voiceClick)];
        [self.voiceIcon addGestureRecognizer:voiceTap];

    }
    return self;
}

二、block传值

1、在.h设置两个block的方法供调用

#import <UIKit/UIKit.h>
@interface ZTSearchBar : UITextField

@property (nonatomic,retain) UIImageView *searchIcon;
@property (nonatomic,retain) UIImageView *voiceIcon;
//block的使用
@property (copy,nonatomic) void (^moreActionBlock)(ZTSearchBar *search);
@property (copy,nonatomic) void (^voiceActionBlock)(ZTSearchBar *voice);

@end

为什么block使用copy修饰?
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈上的,而不是在堆上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。因为栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区. 使用retain也可以,但是block的retain行为默认是用copy的行为实现的, 因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。


2、在.m中相应的事件中调用block方法

- (void)searchClick{
    NSLog(@"点击了搜索按钮哦");
    if (self.moreActionBlock) {
        self.moreActionBlock(self);
    }
}
- (void)voiceClick{
    
    NSLog(@"点击了声音按钮奥");
    if (self.voiceActionBlock) {
        self.voiceActionBlock(self);
    }
}

3、在项目中点击相应的按钮之后调用block方法

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置navigationBar的中间为searchBar
    ZTSearchBar *ztBar = [[ZTSearchBar alloc]init];
    self.navigationItem.titleView = ztBar;
    
    ztBar.moreActionBlock = ^(ZTSearchBar *search) {
        NSLog(@"d更多内容返回到主界面的点击了奥");
    };
    
    ztBar.voiceActionBlock = ^(ZTSearchBar *voice) {
        NSLog(@"声音搜索内容返回到主界面的点击了奥");
    };
}

如下图所示

示意图.png

三、通知传值

1、发送通知

NSDictionary *dict = @{@"key":@"value"};
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"loadSomething" object:nil userInfo:dict]];

2、注册通知:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(load:) name:@"loadSomething" object:nil];

3、实现监听方法

-(void)load:(NSNotification *)notification
{
 NSString *str = notification.userInfo[@"key"];   
// do something
}

四、遍历当前页面所有的控件

遍历当前页面的所有按钮控件,然后,对相应的选中和未按钮进行变色和选中处理。

    for (UIView *subView in self.scroller.subviews) {
            if([subView isKindOfClass:[UIButton class]]){                
                UIButton *but = (UIButton *)subView;
                if ([[NSString stringWithFormat:@"%ld",(long)but.tag-1] isEqualToString:dic[@"streamTag"]]) {                 
                    but.selected = YES;
                    but.backgroundColor = _selColor;
                }else{
                    but.selected = NO;
                    but.backgroundColor = _norColor;
                }                
            }
        }

五、富文本问题

遇到的问题:在项目中遇得到一个莫名奇妙的问题就是富文本的设置在Xcode 9.+版本拖动没问题,但是在升级到Xcode 10.+版本之后,富文本的内容无法滑动,百思不得其解。然后换了一种实现方式,通过计算出TextView的的内容的高度,但是总是计算不精确,出现各种各样的偏差无规律可循,整整折腾了一个下午的时间。造孽啊,然后还是用的晓文同学的方法,做出来的效果最为完美。反思了下,根本原因还是自己对知识点的了解不清楚导致的,下面贴出来以示警戒:
1、正确的处理方式
知识点:https://www.cnblogs.com/YouXianMing/p/3875542.html

// 获取长宽
    CGFloat width  = self.frame.size.width;
    CGFloat height = self.frame.size.height;
    //张凯设置文本透明
    NSMutableAttributedString *mAttStr = [[NSMutableAttributedString alloc] initWithString:self.textString];
    //1、获取段落设置的全部内容
    for (NSString *key in [self.paragraphAttributes allKeys]) {
        NSValue *value = self.paragraphAttributes[key];
        [mAttStr addAttribute:key
                        value:value
                        range:NSMakeRange(0, self.textString.length)];
    }
    /*
     2、遍历取出来富文本参数数组内容(ConfigAttributedString对象的数组):
     1、addAttribute : 富文本属性
     2、value        : 富文本值
     3、range        : 富文本范围
     */
    for (int count = 0; count < _attributes.count; count++) {
        ConfigAttributedString *oneConfig = _attributes[count];
        [mAttStr addAttribute:oneConfig.attribute
                        value:oneConfig.value
                        range:oneConfig.range];
    }

    // 给TextView添加带有内容和布局的容器
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    self.textView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0];

    self.textView.scrollEnabled                    = YES;
    self.textView.editable                         = NO;
    self.textView.selectable                       = NO;
    self.textView.layer.masksToBounds              = YES;
    self.textView.showsVerticalScrollIndicator     = NO;
    self.textView.delegate                         = self;
    self.textView.attributedText = mAttStr;


    // 添加要显示的view
    [self addSubview:self.textView];

2、我的笨方法 ,死活测不准。

    CGFloat textHeight = [self hideLabelLayoutHeight:self.textString withTextFontSize:13.0];
    NSLog(@"~~~~~~~~~~~~~~~~~~~~~详细故事文本的高度为:%f~~~~~~~~~文本高度:%f",textHeight,_textHeight);
        self.textView.contentSize = CGSizeMake(0, textHeight);

/*
 @param text 文本
 
 @param limitW 文本宽度
 
 @param font 字体
 
 @param lineSpacing 行高
 
 @param lineHeightMultiple 行间距
 
 @param lineBreakMode 段落样式
 */
- (NSInteger)hideLabelLayoutHeight:(NSString *)content withTextFontSize:(CGFloat)mFontSize
{
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    
    paragraphStyle.lineSpacing = 26.5;  // 行高
    
    paragraphStyle.paragraphSpacing            = 5.0f; //段落间距

//    paragraphStyle.textFont                    = [UIFont fontWithName:@"FZQKBYSJW--GB1-0" size:16.f];

    paragraphStyle.firstLineHeadIndent         = 0.0f;//首行缩进
    
    
    NSMutableAttributedString *attributes = [[NSMutableAttributedString alloc] initWithString:content];
    [attributes addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13.0] range:NSMakeRange(0, content.length)];

    [attributes addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, content.length)];
    
    CGSize attSize = [attributes boundingRectWithSize:CGSizeMake(self.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size;
    
    if (IS_IPad) {
        return attSize.height+80;
    }
//    else {
//
//            return attSize.height-self.textCount*4+50;
//
//
//
////        else if (self.textCount >= 40 && self.textCount < 60){
////
////            return attSize.height-self.textCount*3;
////
////        }else if (self.textCount >= 60 && self.textCount < 75){
////
////            return attSize.height-170;
////
////        }else if (self.textCount >= 75){
////
////            return attSize.height-300;
////
////        }
//
//    }
    
//    else{
//        if (attSize.height < 2500) {
//            return attSize.height+50;
//        }else if (attSize.height > 2500 && attSize.height<3000) {
//            return attSize.height+100;
//        }else if (attSize.height > 3000 && attSize.height<3300) {
//            return attSize.height+150;
//        } else if (attSize.height > 3300 && attSize.height<3800){
//            return attSize.height+90;
//        }else{
//            return attSize.height;
//
//        }
//    }
    return attSize.height;
}

六、音频播放在面板上的问题

今天测试播放音频的时候突然发现,在控制面板上音频是暂停的状态,找来找去发现是音频没有及时加载出来的原因导致的。吓屎我了!

七、JsonModel的赋值

被这个问题坑了好几个小时,自以为简单不需要记录的自大害了我不止一次,走点心吧!

 self.freeModel = [[AudioBookPkgModel alloc] init];//就是这里没有初始化导致数据总是出不来
    
        self.freeModel.name = model.name;
        self.freeModel.pkgImg = model.pkgImg;
        self.freeModel.bookSubtitle = model.bookSubtitle;
        self.freeModel.numOfBooks = model.numOfBooks;
        self.freeModel.despLong = model.despLong;
        self.freeModel.despShort = model.despShort;
        self.freeModel.subsReqd = model.subsReqd;
        self.freeModel.pkgLevel = model.pkgLevel;
    NSMutableArray<Optional,AudioBookModel> *bookModelArr = [[NSMutableArray<Optional,AudioBookModel> alloc]init];
    for (int i=0; i<self.playingBooks.count; i++) {
        AudioBookModel *bookModel = self.playingBooks[i];
        //主要目的:将数组取出来,然后放到新的数据中。
        if (![bookModel.isFree isEqualToNumber:@0]) {//这里是免费的数据,然后将数据重新拼接起来
                        [bookModelArr addObject:bookModel];
        }
        self.freeModel.audioBooks = bookModelArr;

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容