iOS - 常见问题的整理( 二)
2017-10-13 本文已影响348人
重庆妹子在霾都
一.如何隐藏底部的Tabbar
在实际开发中经常会遇到进入到某一个二级页面的时候需要隐藏底部的tabbar, 主要代码只有一句hidesBottomBarWhenPushed
,但是在每个push
到的页面里面都写这么一句是不是不太友好,而且这句代码写在viewDidLoad
里面是无效的,要写在控制器初始化init
里面,改进代码如下:
// 在NavigationController里面重写pushViewController:方法
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled = NO;
}
if (self.childViewControllers.count == 1) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
}
二.如何解决重写NavigationController
的pushViewController
之后导致左滑不能返回的问题
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animate
{
if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
navigationController.interactivePopGestureRecognizer.enabled = [navigationController.viewControllers count] != 1;
}
}
三.如何隐藏导航栏
/**
取到将要显示的控制器
*/
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
// 如果将要显示的控制器是我想要隐藏导航栏的控制器 就隐藏导航栏
BOOL isShowHomePage = [viewController isKindOfClass:[想要隐藏导航栏的vc class]];
[self setNavigationBarHidden:isShowHomePage animated:YES];
}
四.客户端加载网页时,如何在本地禁止长按手势动作(如拷贝,共享,查询等)
在网页加载完成之后禁止,在网页开始加载的时候加载无效,代码如下:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"webview加载完成之后调用");
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}
当然,也可以在前端加上如下代码:
window.onload=function({
document.documentElement.style.webkitTouchCallout='none';
五.如何做一个不停旋转的动画效果
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ];
rotationAnimation.duration = 15.0;// 设置一次动画完成的时间
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = MAXFLOAT; // 设置了这个就使动画不停的重复
// self.imageview是你想要设置动画的view
[self.imageview.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
六.如何让旋转动画暂停
在项目中,如果做一个音频的播放暂停等功能的话,就希望音频暂停的时候,旋转动画也能停止,音频恢复播放的时候,旋转动画再恢复动画,暂停代码如下:
//1.设置当前的时间作为动画暂停时间
CFTimeInterval pauseTime = [self.imageview.layer convertTime:CACurrentMediaTime() fromLayer:nil];
//2.设置动画的时间偏移量(让动画停留在当前时间的位置)
self.imageview.layer.timeOffset = pauseTime;
//3.将动画的运行速度设置为0, 默认的运行速度是1.0
self.imageview.layer.speed = 0;
恢复旋转动画代码如下:
//1.将动画的时间偏移量作为开始的时间点
CFTimeInterval pauseTime = self.imageview.layer.timeOffset;
//2.计算出开始时间
CFTimeInterval begin = CACurrentMediaTime() - pauseTime;
[self.imageview.layer setTimeOffset:0];
[self.imageview.layer setBeginTime:begin];
self.imageview.layer.speed = 1;
七.如何让tableview的section headerview跟随着tableview滑动 而不要悬浮
最方便的方法就是在创建tableview的时候设置tableview的style为UITableViewStyleGrouped
,但是在设置这个之后每组会有留白,解决方案为:
// fix bug :为了解决设置tableview的UITableViewStyleGrouped的留白
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.01f;
}
八.系统自导的导航栏的item的偏移问题
可能大家都知道系统自带的导航栏的左右barButtonItem有时会觉得距离屏幕的距离太大了需要调整,调整代码如下:
UIButton *testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
[testButton setImage:[UIImage imageNamed:@"xxx"] forState:UIControlStateNormal];
[testButton addTarget:self action:@selector(testButtonClick) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *leftFixItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:testButton];
if ([UIDevice screenMode] == ZEScreenMode414) {
leftFixItem.width = - 17;
}else {
leftFixItem.width = - 15;
}
// leftFixItem 和 leftItem 的顺序很重要 leftFixItem在前表示往左边移 在后表示往右边移
self.navigationItem.leftBarButtonItems = @[leftFixItem, leftItem];
九.如何做到一张图片绕图片上的某个点旋转一定的角度
第一次见到网易云音乐的播放音乐的播放暂停的动画时,觉得特别有感觉,有种老唱片复古的感觉,于是自己动手稍微实现了一下在用户点击音乐暂停时的动画,代码如下:
// 这里最重要的是计算锚点(左上角:(0,0) 右上角:(1,0) 中心:(0.5,0.5) 左下角:(0,1) 右下角:(1,1)) 如果不是上述中的任何一个点也没有关系 可以根据比例来计算就行
CGPoint oldOrigin = self.playingstatusImageView.frame.origin;
self.playingstatusImageView.layer.anchorPoint = CGPointMake(0.8, 12 / 70.0);
CGPoint newOrigin = self.playingstatusImageView.frame.origin;
CGPoint transition;
transition.x = newOrigin.x - oldOrigin.x;
transition.y = newOrigin.y - oldOrigin.y;
self.playingstatusImageView.center = CGPointMake (self.playingstatusImageView.center.x - transition.x, self.playingstatusImageView.center.y - transition.y);
[UIView animateWithDuration:0.5 animations:^{
self.playingstatusImageView.transform = CGAffineTransformMakeRotation(-M_PI * 5/12);
}];
最后实现的效果:
pause.jpeg
暂停之后,用户再点击继续开始,则又恢复原来的动画,代码如下:
CGPoint oldOrigin = self.playingstatusImageView.frame.origin;
// 锚点可以根据宽高比例算出来
self.playingstatusImageView.layer.anchorPoint = CGPointMake(0.8, 12 / 70.0);
CGPoint newOrigin = self.playingstatusImageView.frame.origin;
CGPoint transition;
transition.x = newOrigin.x - oldOrigin.x;
transition.y = newOrigin.y - oldOrigin.y;
self.playingstatusImageView.center = CGPointMake (self.playingstatusImageView.center.x - transition.x, self.playingstatusImageView.center.y - transition.y);
[UIView animateWithDuration:0.5 animations:^{
self.playingstatusImageView.transform = CGAffineTransformMakeRotation(0);
}];
最后的实现效果:
play.jpeg
十.真机测试时,如何显示里面的包内容?
甄姬.jpeg选择Download Container...
,下载到桌面,点击显示包内容即可