当前位置: 首页 > 科技观察

iOS10个实用技巧(总有你不会用的东西)

时间:2023-03-17 18:50:41 科技观察

我们在开发过程中总会遇到各种小问题,有些小问题不是很好解决。这里我总结一下我在开发中遇到的各种小问题以及我的解决方法。比较常见的我就不说了。这里我主要说说一些你可能不知道的事情(当然,你可能都知道,就不用看了)1、你是否也遇到过控件部分圆角的问题?对于这样的问题,一个按钮或者标签只需要右侧有两个圆角,或者只有一个圆角。我们对于它可以做些什么呢。这就需要图层蒙版来帮助我们CGRectrect=CGRectMake(0,0,100,50);CGSizeradio=CGSizeMake(5,5);//圆角大小UIRectCornercorner=UIRectCornerTopLeft|UIRectCornerTopRight;//这个圆角位置UIBezierPath*path=[UIBezierPathbezierPathWithRoundedRect:rectbyRoundingCorners:cornercornerRadii:radio];CAShapeLayer*masklayer=[[CAShapeLayer]masklayer]er;//创建shapelayermasklayer.frame=button.bounds;masklayer.path=path.CGPath;//设置路径button.layer.mask=masklayer;比如button,其他继承自UIView的控件都可以2.navigationBar的透明度如果只把navigationBar的alpha设置为0,相当于隐藏了navigationBar。大家都知道,父视图如果alpha设置为0,那么所有的子视图都会透明。那么对应的navigationBar的标题和左右按钮就会消失。这显然没有达到预期的效果。(1)如果只想让navigationBar透明,按钮和标题可以使用下面的方法:[self.navigationController.navigationBarsetBackgroundImage:[UIImagenew]forBarMetrics:UIBarMetricsDefault];//给navigationBar设置一个空的背景图片为实现透明,标题按钮都进去了,你会发现上面有一条线如下图:这需要我们做进一步的处理,把线去掉,如下:self.navigationController.navigationBar.shadowImage=[UIImagenew];//其实这一行也是图像控制的。设置为空即可(2)如果想在透明的基础上实现根据下拉距离由透明变为不透明的效果,那么上面的就显得力不从心了,这就需要我们采用另一种方法//navigationBar是一个复合视图,由很多控件组成,所以我们可以从它的内部开始[[self.navigationController.navigationBarsubviews]objectAtIndex:0].alpha=0;//这里可以使用scrollView的偏移量来设置alpha实现渐变透明的效果3.全局设置navigationBar标题的样式和barItem的标题样式//UIColorWithHexRGB()这个方法是自己定义的,这里只需要给一个颜色[[UINavigationBarappearance]setBarTintColor:UIColorWithHexRGB(0xfefefe)];[[UINavigationBarappearance]setTitleTextAttributes:@{NSFontAttributeName:[UIFontboldSystemFontOfSize:18],NSForegroundColorAttributeName:UIColorWithHexRGB(0xfe6d27)}];[[UITabBarItemappearance]setTitleTextAttributes:@{NSFontAttributeName:[UIFontboldSystemFontOfSize:10],NSForegroundColorAttributeName:UIColorWithHexRGB(0x666666)}forState:UIControlStateNormal];[[UITabBarItemappearance]setTitleTextAttributes:@{NSFontAttributeName:[UIFontboldSystemFontOfSiz4,使用中肯定遇到过多的navigationBar隐藏显示,一个页面隐藏了navigationBar,另一个没有。两个页面的push和pop时,尤其是有侧滑手势返回时,如果不做处理,滑动返回时navigationBar位置为空,直接显示黑色或者下层的navigationBar显示视图,这是丑陋的。这就需要我们添加过多的动画来隐藏或显示navigationBar:返回后会出现的页面实现了viewWillAppear方法,需要隐藏就设置为YES,需要显示就设置为NO-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];[self.navigationControllersetNavigationBarHidden:NOanimated:YES];}5.侧滑手势返回iOS侧滑返回手势操作体验好,应用不支持侧滑返回的绝对不是一个好的应用。但是在开发过程中,自定义返回按钮时,或者某些webView、tableView等页面,滑动返回手势是无效的。这个时候我们就需要设置一下。基类中可以协商如下代码:if([self.navigationControllerrespondsToSelector:@selector(interactivePopGestureRecognizer)]){//需要跟随手势的代理self.navigationController.interactivePopGestureRecognizer.delegate=self;self.navigationController。interactivePopGestureRecognizer.enabled=YES;}问题:当返回最顶层的navigationControllerController时。再次向侧面滑动。这时候你在点击一个推送页面操作,你会发现卡住了,要等很久才有反应。这是因为最上面的Controller上的手势还是有效的,但是滑动之后,找不到返回的页面。导致软件卡顿,假死所以这个手势必须在rootViewController中失效。将以下设置为NOself.navigationController.interactivePopGestureRecognizer.enabled=YES;当然也可以使用第三方库,写的还是不错的。他扩展了系统的侧滑返回手势,不再是从边缘滑动,而是直接向右滑动返回。最重要的是,他只需要加入项目,无需一行代码就可以实现。附上github网址https://github.com/forkingdog/FDFullscreenPopGesture6。向webView添加标题视图。webView是一个复合视图,里面包含一个scrollView,scrollView里面是一个UIWebBrowserView(负责显示WebView的内容)UIView*webBrowserView=self.webView.scrollView.subviews[0];//获取webView的webBrowserViewself.backHeadImageView=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0,kScreenWidth,kScreenWidth*2/3.0)];[_backHeadImageViewsd_setImageWithURL:[NSURLLWithString:self.imageUrl]placeholderImage:[UIImageimageNamed:@"placeholderImage"]];[self.webViewinsertSubview:_backHeadImageViewbelowSubview:self.webView.scrollView];//将backHeadImageView插入到webView下面的scrollView中CGRectframe=self.webBrowserView.frame;frame.origin.y=CGRectGetMaxY(_backHeadImageView.frame);self.webBrowserView.frame=frame;//改变webBrowserView的frame,将backHeadImageView的高度下移,使其可见7.模态跳转的动画设置设置模态跳转的动画,系统提供了四个选项DetailViewController*detailVC=[[DetailViewControlleralloc]init];//UIModalTransitionStyleFlipHorizo??ntalflip//UIModalTransitionStyleCoverVertiCal在底部滑出//UIModalTransitionStyleCrossDissolve淡入//UIModalTransitionStylePartialCurl翻页detailVC.modalTransitionStyle=UIModalTransitionStylePartialCurl;[selfpresentViewController:detailVCanimated:YEScompletion:nil];8.图片处理只获取部分图片UIImage*image=[UIImageimageNamed:filename];CGImageRefimageRef=image.CGImage;CGRectrect=CGRectMake(origin.x,origin.y,size.width,size.height);//这里的宽高是相对于图片真实尺寸的//比如你的图片是400x400那么(0,0,400,400)是图片的全尺寸,你可以设置你想拍哪部分的对应坐标。UIView设置图片UIImage*image=[UIImageimageNamed:@"playing"];_layerView.layer.contents=(__bridgeid)image.CGImage;_layerView.layer.contentsCenter=CGRectMake(0.25,0.25,0.5,0.5);//同理可以设置显示图片范围//不过这里稍微有点不同,这里的四个值都在0-1之间;对应的还是写x,y,widt,height10,给TableView或者CollectionView的cell添加简单的动画只要在willDisplayCell方法中Animate要显示的cell即可:-(void)tableView:(UITableView*)tableViewwillDisplayCell:(UITableViewCell*)cellforRowAtIndexPath:(NSIndexPath*)indexPath{NSArray*array=tableView.indexPathsForVisibleRows;NSIndexPath*firstIndexPath=array[0];//设置anchorPointcell.layer.anchorPoint=CGPointMake(0,0.5);//为了防止cellview移动并放回原来的位置cell.layer.position=CGPointMake(0,cell.layer.position.y);//设置cell按z轴旋转90度,注意arcif(firstIndexPath.row