iOS開發程式猿必備技巧
隨著移動智慧手機的火爆,作為移動智慧手機作業系統的ios也越來越發火爆,本文主要是一個潛伏在碼農界N久的iOS程式猿總結、收刮的一些ios開發精華技巧,需要的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];
log 打因結果如下: iamgeAspectRect = {{37.563884156729145, 0}, {224.87223168654171, 300}}, imageView ={{37.5, 183.5}, {300, 300}} 可以從 log 得出 對應的 image 以 aspectFit 的方式在 imageView 的位置,在 imageView 中的位置是(37.5,0)。這樣你根本不需要任何多的程式碼來計算了。(ps:這個函式是在 AV框架的,童鞋們自行匯入。)
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,最初查的資料是通過 CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];
來得到的,但是不知道為什麼 layer的 transform 的 scale 和 view 的當前的縮放 scale 不一致,通過 debug,得到 view的 transform 的 a的值和當前的縮放值是一樣的。
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)的位置,就沒有問題了。
文章來源:ios開發 推薦學習:ios開發視訊教程
相關文章
- 程式猿必備的10個移動開發工具移動開發
- iOS開發必備外掛iOS
- IT猿漲工資必備技能--GCT答題技巧GC
- PHP程式猿必備的七種武器PHP
- Swift開發必備技巧:static和class的使用Swift
- 程式猿必備的Linux基礎知識Linux
- iOS開發大神必備的Xcode外掛iOSXCode
- 程式猿必備的17款最佳的程式碼審查工具
- c# 高併發必備技巧(三)C#
- iOS 開發小技巧iOS
- 微信小程式開發必備技能清單微信小程式
- Mac 開發必備工具Mac
- iOS開發中的技巧iOS
- iOS開發奇淫技巧iOS
- 程式猿/媛必備的開發學習資源彙總(不斷新增中,也歡迎大家補充...)
- 前端開發必備網站前端網站
- leetcode:程式猿面試技巧LeetCode面試
- iOS開發小技巧合集iOS
- iOS 基礎開發技巧 (一)iOS
- iOS開發—技巧總結(一)iOS
- Python 機器學習的必備技巧Python機器學習
- 程式猿必知必會Linux命令之awkLinux
- 當儲存引數使用結構體時必備的開發技巧方式結構體
- 開發必備的webpack4Web
- 容器雲開發必備知識
- 專案開發必備API介面API
- 15款Java程式設計師必備的開發工具Java程式設計師
- Flutter與IOS、Android開發人員搶飯碗必備良器FlutteriOSAndroid
- 七款Debug工具推薦:iOS開發必備的除錯利器iOS除錯
- 深度學習開發必備開源框架深度學習框架
- JavaScript程式設計師必備的5個debug技巧JavaScript程式設計師
- Vue開發必須知道的36個技巧Vue
- Java程式設計師必備的6款最佳開發工具Java程式設計師
- Web開發人員必備的18個iPhone應用程式WebiPhone
- iOS高階開發者面試必過技巧iOS面試
- iOS開發系列--IOS程式開發概覽iOS
- 開發必備之單元測試
- vue-devtools 必備開發工具Vuedev