iOS开发的一些小技巧

   1.神器计算图片位置的函数:AVMakeRectWithAspectRatioInsideRect()

  通过这个函数,我们可以计算一个图片放在另一个 view 按照一定的比例居中显示,可能说的我比较抽象,还是用图来显示,可以说它可以直接一个 image 以任何的比例显示显示在 imageview 中居中所处的位置,拿 UIViewContontAspectFit来演示,

  UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 300, 300)];

  imageView.center = self.view.center;

  imageView.backgroundColor = [UIColor redColor];

  imageView.contentMode = UIViewContentModeScaleAspectFit;

  UIImage *image = [UIImage imageNamed:@"mm.jpg"];

  imageView.image = image;

  CGRect iamgeAspectRect = AVMakeRectWithAspectRatioInsideRect(image.size, imageView.bounds);

  NSLog(@"iamgeAspectRect = %@, imageView =%@",NSStringFromCGRect(iamgeAspectRect),NSStringFromCGRect(imageView.frame));

  [self.view addSubview:imageView];

  图片显示如下:(ps:这妹子是我公司一个管理公司weibo账号的妹纸,目前我在勾搭,你们不要羡慕,生活依然很美好的嘛!)

开发的一些小技巧-ios开发小技巧">
  log 打因结果如下:

  1iamgeAspectRect = {{37.563884156729145, 0}, {224.87223168654171, 300}}, imageView ={{37.5, 183.5}, {300, 300}}

  可以从 log 得出 对应的 image 以 aspectFit 的方式在 imageView 的位置,在 imageView 中的位置是(37.5,0)。这样你根本不需要任何多的代码来计算了。(ps:这个函数是在 AV框架的,童鞋们自行导入。)

  具体它的其他的好处,如果你是做相机或者图片处理的你就知道它的好处了,什么处理横屏照片了,16:9,1:1,4:3图片在控件中的位置,控件上的点对应图片上的点的位置拉,等等。

  2.关于 如果一个矩形如果做了平移旋转缩放等一系列操作之后,上下左右的四个点(甚至矩形上任意一个点)的位置。

  CGPoint originalCenter = CGPointApplyAffineTransform(_mStyleLeftEyeView.center,

  CGAffineTransformInvert(_mStyleLeftEyeView.transform));

  //1左眼内眼角

  CGPoint bottomRight = originalCenter;

  bottomRight.x += _mStyleLeftEyeView.bounds.size.width / 2;

  bottomRight.y += _mStyleLeftEyeView.bounds.size.height / 2;

  bottomRight = CGPointApplyAffineTransform(bottomRight, _mStyleLeftEyeView.transform);

  首先这个 styleLeftView 就是一个矩形的 view,这里以右下角的点做示范,做无论做了任何的 tranform 之后都可以得到它的点的位置,具体它用在什么位置,我就不方便透露了,(妈蛋,说多了,就相当于把公司我写的代码开源了)

  3.在使用 pinch 的时候我们设置 pinch 缩放的最大值和最小值(系统默认没有提供最大值和最小值的 api),设置 pinch的 maxValue,minValue.

  if([gestureRecognizer state] == UIGestureRecognizerStateBegan)

  {

  // Reset the last scale, necessary if there are multiple objects with different scales

  mLastScale = [gestureRecognizer scale];

  }

  if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||

  [gestureRecognizer state] == UIGestureRecognizerStateChanged)

  {

  CGFloat currentScale = gestureRecognizer.view.transform.a;

  //计算出 缩放平移的 scale

  CGFloat deletaScale = (mLastScale - [gestureRecognizer scale]);

  CGFloat newScale = 1 - deletaScale;

  newScale = MIN(newScale, kMaxScale / currentScale);

  newScale = MAX(newScale, kMinScale / currentScale);

  CGAffineTransform scaleTransform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);

  //随着移动要调整一下 view 的 center point 位置

  [gestureRecognizer view].transform = scaleTransform;

  NSLog(@"self.iconView.height = %@ ,width = %@",@(self.iconView.width),@(self.iconView.height));

  mLastScale = [gestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call

  聪明的小伙伴应该一下就知道这个是怎么处理的,唯一需要注意的是 当前的缩放的 scale,最初查的资料是通过

  1 CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

  来得到的,但是不知道为什么 layer的 transform 的 scale 和 view 的当前的缩放 scale 不一致,我通过 debug,得到 view的 transform 的 a的值和当前的缩放值是一样的,因为工作缘故不能凡事挖的特别透,所以大家想知道为什么 a 就是 scale 值可以自行查阅分享给我。

  4.最后再分享给大家一个缩放时,缩放的中心点的问题,绝大部分我们缩放都是以 view 的中心点来缩放的,但是某些情况下我们需要以下面的边不动。 譬如下面图像这种


  这种方式,我最早是希望通过缩放的时候同时平移就可以处理了,根据缩放的尺寸,缩放到上面多少就平移下来多少,保持下边不动,但是发现特别麻烦。后来使用 layer 的 anchorPoint 来出来,发现特别简单,唯一需要填的坑就是改变 anchorPoint 的时候,它的 frame 会发生瞬移的变化,天啊噜,还好我完美解决!

  -(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view

  {

  CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x,

  view.bounds.size.height * anchorPoint.y);

  CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x,

  view.bounds.size.height * view.layer.anchorPoint.y);

  newPoint = CGPointApplyAffineTransform(newPoint, view.transform);

  oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);

  CGPoint position = view.layer.position;

  position.x -= oldPoint.x;

  position.x += newPoint.x;

  position.y -= oldPoint.y;

  position.y += newPoint.y;

  view.layer.position = position;

  view.layer.anchorPoint = anchorPoint;

  }

  通过这种方式设置 anchorPoint,如果后续你做平移前 速度把 AnchorPoint设置到(0.5,0.5)的位置,就没有问题了。

  5.最后一个就是分享下大家团队如果使用 git 来开发,可以快速定位你现在看不懂的代码是哪个2货写的,然后即使把锅甩到他身上 (ps:如果是自己写的,你就默不作声,别让别人知道这个技巧哈),其实就是 show blame for line.


  当然这种操作是可以使用快捷操作的,熟悉我的人应该都知道我的风格,我把 show blame for line 改成快捷键?+c 的操作了(ps:怎么改看我前面的博客)。好了以后有问题及时找到你的同事,质问他你这写的什么垃圾代码,我这种大神都不看不懂。

  结束语

  原来没有用 swift 写演示,最近也是在学,但是没有时间写,本来要写的 storyBoard和 AutoLayout 技巧篇,也是因为最近人写这个太多的,感觉有不少雷同,但是只写出来不同的也写不出来太多,原酿我(后续我会学着写动画,到时给你们带来酷炫的动画哦)!

时间: 2024-10-03 08:26:10

iOS开发的一些小技巧的相关文章

分享一些iOS开发实用的小技巧_IOS

1.设置navigationbar title颜色 UIColor *whiteColor = [UIColor whiteColor]; NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName]; [self.navigationController.navigationBar setTitleTextAttributes:dic]; 2.获取

提高iOS开发效率的小技巧与思路_IOS

先用一张图展示学习iOS开发应该掌握的知识体系: 1.全图片作为背景的时候,可能遇到的问题.,滑回的时候,图片停留了一会才滑回去. 原因: 这种界面一般使用一般用imageView的第三种填充方式. 这种填充方式可以让图片不被压缩变形的前提下,尽可能去填充整个控件,但是设置这个枚举的填充方式的时候,记得按照下图这样设置,将超出控件范围的给切割掉 设置约束的时候,记得选择currentview的那个对象 2.设备适配的问题 还是上面这张图片,按照设计在6p上面来设置自动约束,约好后,在5s上面的时

你可能忽视的iOS 8 Safari浏览器小技巧

  掐指算来iOS 8正式版发布已经有一季之久,而iPhone 6玩机也两个月有余,是时候和大家分享一些关于新系统下使用心得,本文为你带来几个容易让人忽略的Safari浏览器小技巧.首先常规报一下小编的iOS设备信息,美版iPhone 6 64G(Gold,A1549),iOS版本8.1.1,未越狱. 顺便也提一下为什么小编购买美版的诸多原因吧!首先,肯定是网络制式问题,小编掉联通的坑良久,美版支持联通和电信2/3/4G网络(已实测),以及移动2G(and EDGE),这里网络完全适用.再者,就

jQuery前端开发35个小技巧_jquery

废话不说 直接代码,有问题可以一起交流 1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 Hide when clicked in the search field, the value.(example can be found below in the comment fields) $(docu

iOS 7 的十个小技巧 - 小 Tips 让你更好地使用苹果最新固件

class="post_content" itemprop="articleBody"> 苹果 iOS 7 系统已经正式发布,相信很多朋友都已经下载并开始体验了.作为 iOS 史上最彻底的一次更新,iOS 7 不仅使用了全新的扁平化设计,在系统操作.文件分享以及一些基础功能方面都得到了增强,同时也提升了系统的安全性-- 所以,即使是 iOS 的老用户,在刚刚使用 iOS 7 时可能也会有一些不适应,所以我们在这里列举了10个使用 iOS 7 的小技巧,来帮助你

iOS 10个实用小技巧(总有你不知道的和你会用到的)

在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决.在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法.比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有可能你都知道,大神就不必往下看了) 1.控件的局部圆角问题 你是不是也遇到过这样的问题,一个button或者label,只要右边的两个角圆角,或者只要一个圆角.该怎么办呢.这就需要图层蒙版来帮助我们了 CGRect rect = CGRectMake(0, 0, 100, 50);        C

Silverlight 游戏开发“.NET研究”小技巧:星球大战字幕效果

各位科幻迷可能对星球大战的字幕效果印象深刻,这个电影字幕表现手法曾经风靡大小美国影片,甚至超人影片和电视也曾经用此来做开场和结尾字幕,今天我就将这个效果在blend里面制作技巧告诉大家,下面是星球大战的图片: 可能大家觉得这做成一个游戏开发技巧有点牵强,我计划以此作为引子,引出有关于Silverlight特效制作的关键知识点--Projection,在直接翻译上是投影的意思,但是一般我们称之为3D变换,RenderTransform一般是2D的变换,如果使用了Projection那么就能弄出非常

Android 开发中常用小技巧

TextView中的getTextSize返回值是以像素(px)为单位的, 而setTextSize()是以sp为单位的. 所以如果直接用返回的值来设置会出错,解决办法是 用setTextSize()的另外一种形式,可以指定单位: 在继承自View时,绘制bitmap时,需要将图片放到新建的drawable-xdpi 中,否则容易出现绘制大小发生改变 在文字中加下划线: textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG); scro

Linux以及Android开发中的小技巧和长繁命令记录收集

不断更新收集中.... 201407161654 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080端口建立网络连接,同时创建端口为5678的本地代理服务 ssh -C -f -N -o 'TCPKeepAlive=yes' -L 5678:172.24.61.252:8080 nx_guest@172.24.221.137 反编译android下的二进制程序 ./prebuilts/gcc/linux-x8