iOS工作笔记(十七)

1.导航栏修改title并带动画属性

效果如图

这个需要用到CATransition。示例如下

//设施导航栏标题,直接使用self.title是没有动画效果的
-(void)setNav{
    UILabel *lab = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
    lab.text = @"导航栏";
    lab.textColor = [UIColor blackColor];
    self.navigationItem.titleView = lab;
}
//切换标题动画
-(void)clickNavRightBar{
    CATransition *animation = [CATransition animation];
    animation.duration = 1.0;
    animation.type = kCATransitionPush;
    animation.subtype = kCATransitionFromTop;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [self.navigationItem.titleView.layer addAnimation:animation forKey:@"changeTitle"];

    NSString *titleStr = ((UILabel*)self.navigationItem.titleView).text;
    if ([titleStr isEqualToString:@"导航栏"]) {
        ((UILabel*)self.navigationItem.titleView).text = @"换了";
    } else {
        ((UILabel*)self.navigationItem.titleView).text = @"导航栏";
    }
}

2.GCD中group函数的使用

假如一个界面有两部分a和b组成,但数据由两个接口返回。现在要求是只有等两个接口的数据都加载完成后才能进行下一步操作。
那么可以用gcd的group函数

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //a部分数据
    [self doSomethingA];
});

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //b部分数据
    [self doSomethingB];
});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    //请求完毕后处理
});

其中,doSomethingA和doSomethingB都是同步处理时,这样是没问题的。
若a、b处理数据时用的是block,并且是异步的。那么这样写就会出问题。因为异步不会阻塞当前线程,所以就会出现a、b数据还没处理完就开始执行“请求完毕后再进行的操作”。所以这时应为

dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[[TestBlockModel sharedInstance]executeWithStr:nil block:^(NSString *parameter) {
    //处理a部分数据
    //…………
    dispatch_group_leave(group);
}];

dispatch_group_enter(group);
[[TestBlockModel sharedInstance]executeWithStr:nil block:^(NSString *parameter) {
    //处理b部分数据
    //…………
    dispatch_group_leave(group);
}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    //请求完毕后处理
});

3.修改UISearchBar清除按钮的颜色,可以用

UIImage *imgClear = [UIImage imageNamed:@"nav_icon_close"];
[searchBar setImage:imgClear forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
[searchBar setImage:imgClear forSearchBarIcon:UISearchBarIconClear state:UIControlStateHighlighted];

4.图片点击方法

当一个view上有多个控件,这时想写点击图片的方法。那么可以用:
之前的写法是通过

UIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, kHeadIconHeight, kHeadIconHeight)];
imgView.image = [UIImage imageNamed:@"head_icon"];

imgView.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickHeadIcon)];
[imgView addGestureRecognizer:tap];

-(void)clickHeadIcon{
    NSLog(@"点击头像");
}

这种写法最常见。现在可以用另一种方式解决,这种方法大部分与上边一致,不同的只是不用填加imgView.userInteractionEnabled = YES这个方法。用点击的点是否在imgView内来判断是否触发事件发生。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    // 判断点击的点,在不在圆内
    CGPoint center = self.imgView.center;
    CGFloat r = self.imgView.frame.size.width * 0.5;
    CGFloat newR = sqrt((center.x - point.x) * (center.x - point.x) + (center.y - point.y) * (center.y - point.y));
    if (newR > r) {
        return false;
    } else {
        return true;
    }
}

5.label自适应字体

之前都是label字体、高度确定,让宽度适应。现在有需求是宽度、高度一定,让字体自适应。可以用

label.adjustsFontSizeToFitWidth = YES;

这一行代码就足够了

6.判断字符串是否为小数点和数字组成

#define NUMBERS @"0123456789."

/** 判断字符串是否为数字和小数点 */
-(BOOL)isOnlyhasNumberAndpointWithString:(NSString *)string{
    NSCharacterSet *cs=[[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
    NSString *filter=[[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [string isEqualToString:filter];
}

7.在tableview reloadSections时,即使把动画设置为UITableViewRowAnimationNone时也会出现奇怪的动画。如交错等

[self.tableView reloadSections:set withRowAnimation:UITableViewRowAnimationNone];

此时有两种解决方案
①将reloadSections替换为reloadData,刷新局部改为刷新整体,但这样违背了初衷
②将动画强制取消

[UIView performWithoutAnimation:^{
    [self.tableView reloadSections:set withRowAnimation:UITableViewRowAnimationNone];
}];
时间: 2024-10-14 06:03:07

iOS工作笔记(十七)的相关文章

iOS工作笔记之NSClassFromString

id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init]; 和 id myObj = [[MySpecialClass alloc] init]; 是一样的.但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已. 因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化. 比如在iPhone中,NSTask可能就会出现这种情

IOS工作笔记(二)

1.懒加载(即延迟加载)只有被调用时才初始化,防止资源浪费,需要重写对象 的get方法,且必须写成成员变量形式,如_imageData.可以这么写,如: 1 @property(nonatomic,strong) NSArray *imageData; 2 3 -(NSArray *)imageData{ //重写imageData的get方法 4 if(_imageData == nil){ 5 //初始化数据 6 NSMutableDictionary *image1 = [NSMutabl

IOS工作笔记(五)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.frame的打印,可以用 NSLog(@"%@",NSStringFromCGRect(self.view.frame)); 2.UIButton文字的对齐方式,以左对齐为例 myBtn.titleLabel.textAlignment = NSTextAlignmentLeft;//这种设置方式无效 myBtn.contentHorizontalAlignment = UIControlConte

IOS工作笔记(三)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.选定ipad支持的方向,如强制横屏等,需要在General——>Deployment Info ——>Device Orientation选择,含义如下: 所以要想强制横屏的话,可以点选 2.UIView中如何添加xib文件? 如新建一个UIView为DocDetailView,那么建的那个xib文件在custom class中class应写成跟UIView名字一样的,这里要写成DocDetailView,

IOS工作笔记(七)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.在定义UITableViewCell时,组件可以直接加,也可以添加到contentView中 [self addSubViews:myBtn]; [self.contentView addSubViews:myBtn]; 但最好添加在contentView中,因为contentView可以定义很多东西. 2.关于下拉刷新和上拉加载,可以用是第三方框架MJRefresh,地址在 https://github.c

IOS工作笔记(四)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.ios7中,对状态栏的调整是在控制器中进行的. 1 //设置状态栏为白色 2 -(UIStatusBarStyle)preferredStatusBarStyle{ 3 return UIStatusBarStyleLightContent; 4 } 5 //隐藏状态栏 6 -(BOOL)prefersStatusBarHidden{ 7 return YES; 8 } 2.给UIImageView或UILa

IOS工作笔记(九)

关于IOS与服务器交互json数据①从服务器接受json数据:这个可以用AFN,接受方式一般为get.如: 1 +(NSArray *)getContactsFromServer:(ZMMeetingAddViewController *)meetingAddController{ 2 NSMutableArray *contactsArr = [NSMutableArray array]; 3 4 NSString *urlGetContactsFromServer = [NSString s

IOS工作笔记(六)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.NSArray中使用firstObject和lastObject的好处在于,当数组为空时,返回nil,而不会报错. 当数组为空,使用myArray[0]时,会报错. 2.UILabel和UIImageView都可以添加点击事件,以UIlabel为例. 1 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTa

IOS工作笔记(一)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当足迹吧! 1.xib开发ipad使用横屏,可以在xib的view设置orientation为landscape,portrait是竖屏. 2.在.m文件中声明UITextField后,若想获取.比如想获取pwd@property(nonatomic,weak) UITextField *pwd;那么可以用 self.pwd.text获取. _pwd.text;// 这也可以获取到. 因为self.view其实调用的是pwd的g