OC 小代碼塊

来源:http://www.cnblogs.com/dx-230/archive/2017/07/11/7149587.html
-Advertisement-
Play Games

1、設置導航欄標題的字體顏色和大小 方法一:(自定義視圖的方法,一般人也會採用這樣的方式) 就是在導航向上添加一個titleView,可以使用一個label,再設置label的背景顏色透明,字體什麼的設置就很簡單了。 //自定義標題視圖 UILabel *titleLabel = [[UILabel ...


1、設置導航欄標題的字體顏色和大小

   方法一:(自定義視圖的方法,一般人也會採用這樣的方式)

        就是在導航向上添加一個titleView,可以使用一個label,再設置label的背景顏色透明,字體什麼的設置就很簡單了。

       

  
//自定義標題視圖
UILabel *titleLabel = [[UILabel  
alloc] initWithFrame:CGRectMake(0, 020044)];
titleLabel.backgroundColor = [UIColor grayColor];
titleLabel.font = [UIFont boldSystemFontOfSize:20];
titleLabel.textColor = [UIColor greenColor];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.text = @"新聞";
self.navigationItem.titleView = titleLabel;
View Code

  

  方法二:(在預設顯示的標題中直接修改文件的大小和顏色也是可以的)

  
[self.navigationController.navigationBar setTitleTextAttributes:@{
                                                                           NSFontAttributeName:[UIFont systemFontOfSize:19],
                                                                           NSForegroundColorAttributeName:[UIColor redColor]
                                                                         }
        ]
View Code

 

2、多容器添加同一子控制項的bug

  [someView addSubView:sbView];

  那麼在被添加到父視圖someView之前,如果sbView已經被otherView載入了,那麼上面的代碼會先講sbView從otherView remove掉,在被載入到someView。

  所以一個view是不可能同時被2個以上的view載入做子視圖的。

 

3、返回根控制器

  
- (void)dismissToRootViewController:(UIViewController *)viewController{
    if (viewController.presentingViewController == nil) {
        [viewController.navigationController popToRootViewControllerAnimated:NO];
    }else{
        UIViewController *vc = viewController.presentingViewController;
        while (vc.presentingViewController != nil) {
            vc = vc.presentingViewController;
        }
        [vc dismissViewControllerAnimated:NO completion:nil];
    }
}
View Code

 

4、獲取照片拍攝地點信息

  
- (NSDictionary *)metadata {
    return self.asset.defaultRepresentation.metadata;
}

- (CLGeocoder *)geoC
{
    if(!_geoC){
        _geoC = [[CLGeocoder alloc] init];
    }
    return _geoC;
}
- (void)addressInit{
      // 獲取位置信息
    NSDictionary *metadata = [self metadata];
    NSDictionary *GPSDict=[metadata objectForKey:(NSString*)kCGImagePropertyGPSDictionary];
     // 經緯度
    CLLocationDegrees latitude = [[GPSDict objectForKey:@"Latitude"] doubleValue];
    CLLocationDegrees longitude = [[GPSDict objectForKey:@"Longitude"] doubleValue];
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
    WEAKSELF
     // 反地理編碼
    [self.geoC reverseGeocodeLocation:loc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        CLPlacemark *pl = [placemarks firstObject];
        if(error == nil){
            NSString *str = [NSString stringWithFormat:@"%@%@%@",pl.locality, pl.subLocality, pl.name];
            weakSelf.address = str;
        }
        else{
            weakSelf.address = @"";
        }
    }];
}
View Code

 

5、隨機數  隨機色

  Objective-C 中有個arc4random()函數用來生成隨機數且不需要種子,

       但是這個函數生成的隨機數範圍比較大,需要用取模的演算法對隨機值進行限制,有點麻煩。

   

  更方便的隨機數函數arc4random_uniform(x),

       可以用來產生0~(x-1)範圍內的隨機數,不需要再進行取模運算。

       如果要生成1~x的隨機數,可以這麼寫:arc4random_uniform(x)+1

 

  隨機色:

  
#define random(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0alpha:(a)/255.0]

#define randomColor random(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))

[UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1];
View Code

 

6、退出app

  
 AppDelegate *app = [UIApplication sharedApplication].delegate;
 UIWindow *window = app.window;
           
  [UIView animateWithDuration:0.4f animations:^{
         window.alpha = 0;
         CGFloat y = window.bounds.size.height;
         CGFloat x = window.bounds.size.width / 2;
         window.frame = CGRectMake(x, y, 0, 0);
 } completion:^(BOOL finished) {
          exit(0);
  }];
View Code

 

7、移除導航條按鈕

  
 UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
    button.frame = CGRectMake(003030);
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = barButton;
#if 0
    //第一種
    self.navigationItem.leftBarButtonItem = nil;
#else
    //第二種
    [self.navigationController.navigationBar.subviews.lastObject setHidden:YES];
#endif
View Code

 

8、隱藏導航欄下劃線

  
    // 1)聲明UIImageView變數,存儲底部橫線
    @implementation MyViewController {
        UIImageView *navBarHairlineImageView;
    }
   //  2)在viewDidLoad中加入:
    navBarHairlineImageView = [self findHairlineImageViewUnder:navigationBar]
   
   // 3)
    - (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
        if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
            return (UIImageView *)view;
        }
        for (UIView *subview in view.subviews) {
            UIImageView *imageView = [self findHairlineImageViewUnder:subview];
            if (imageView) {
                return imageView;
            }
        }
        return nil;
    }
   
    // 最後在viewWillAppear,viewWillDisappear中處理
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        navBarHairlineImageView.hidden = YES;
    }
   
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        navBarHairlineImageView.hidden = NO;
    }


    WEAKSELF
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [weakSelf.navigationController.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([obj isKindOfClass:NSClassFromString(@"_UIBarBackground")]) {
                [obj.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                    if ([obj isKindOfClass:[UIImageView class]]) {
                        [obj setHidden:YES];
                    }
                }];
            }
        }];
    });
View Code

 

9、translucent 與 controller.view

  translucent = NO;

      

   translucent = YES;

      

10、禁用第三方輸入法

  
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString*)extensionPointIdentifier
{
    return NO;
}
View Code

 

11、UIView截屏

  
  /*
    UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0);
   
    CGContextRef context = UIGraphicsGetCurrentContext();
   
    // Render the view
    [view.layer renderInContext:context];
   
    // Get the image from the context
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
   
    // Cleanup the context you created
    UIGraphicsEndImageContext();
   
    return renderedImage;
    */  
+ (UIImage *)snapShotFrom:(UIView *)view{   
    // 避免frame為nil導致異常
    if (CGRectIsEmpty(view.frame)) {
        return nil;
    }
   
    UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0.0);
   
    if ([view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
        [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    }
    else{
          // 占用記憶體高  引起異常
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    }
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
   
    return image;
}
View Code

  當視圖快速切換時的崩潰

    這個崩潰是使用了while迴圈連續截屏100次webview發現的,崩潰為EXE_BAD_ACCESS 

    原因是afterScreenUpdates設置為了YES.

  為什麼會崩潰呢? 因為設置為YES後,這些方法會等在view update結束在執行,如果在update結束前view被release了,會出現找不到view的問題.所以需要設置為NO. 

 

12、XCODE調試時不顯示變數值/指針地址的解決方案

  1.Scheme中run裡面確保設成debug

    

   2.build settings-搜索optim,確保是-O0

    

  3.build settings-搜索-O2,改成-g。這項最坑爹,好像是預設的設置成-O2的

    

 

13、比較兩個圖片是否相同

   1.如果2張圖片都被載入都resource中,而且圖片名稱已知,使用imageNamed:創建2個UIImage對象就好,然後用isequal去比較。

   2.兩張圖片存儲在ios沙盒的某個位置,未被載入到resource中,比較兩個UIImage的data,看看是否相同。

  
NSString* file = [dic stringByAppendingPathComponent:path];

UIImage *image = [UIImage imageWithContentsOfFile:file];

NSData *data1 = UIImagePNGRepresentation(image1);

NSData *data = UIImagePNGRepresentation(image);

if ([data isEqual:data1]) {

      NSLog(@"is equae");
}
View Code

 

14、UITableView間隔、顏色

   要想改變其seperator的高度,是做不到的

    首先,我們將其sperator設置為none。

    其次,我們在構建tableview的時候,使用多secton,每個section中僅有一個row的方式構建

    第三,設置每個sectionheaderView的高度為要求的高度。

    第四,重新定製每一個sectionheaderView,設置section的背景顏色為指定的顏色。

    代碼如下:

  
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, height)]; //height為設計師制定的高度。
        view.backgroundColor = [UIColor redColor];
        return view;
}
View Code

 

15、實時檢測UITextField的變化

  使用UISearchBar,UISearchBar的內容動態改變的時候,我們是可以通過代理來獲知這個改變的。

    在使用UITextField的時候,沒有合適的代理函數,使用註冊通知。

  
    // 1,在initWithNibName中註冊對應的通知:
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChanged:) name:UITextFieldTextDidChangeNotification object:_passwordTextField];
        }
        return self;
    }
    
    // 2,實現textFieldChanged函數
    - (void)textFieldChanged:(id)sender
    {
        NSLog(@"current ContentOffset is %@",NSStringFromCGPoint(_contentView.contentOffset));
    }
    
    // 3,記得在dealloc中刪除掉通知。
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
}
View Code

 

16、UITextField加陰影

  UITextView輸入的時候,文字下麵有陰影,系統預設只有UILabel有幾個簡單的介面可以設陰影,

  至於UITextView的陰影就基本上沒人用了,給UITextView的文字加陰影的辦法,即通過layer層來設置。

   上代碼

    請記得加入 QuartzCore.framework。

  View Code

 

17、判斷程式第一次啟動  

  View Code

 

18、查看UUID

  1.查看 xx.app 文件的 UUID,terminal 中輸入命令 :

    ·dwarfdump --uuid xx.app/xx (xx代表你的項目名)

   2.查看 xx.app.dSYM 文件的 UUID ,在 terminal 中輸入命令:

    ·dwarfdump --uuid xx.app.dSYM

   3.crash 文件內第一行 Incident Identifier 就是該 crash 文件的 UUID。

 

19、禁用手勢

  
<UIGestureRecognizerDelegate>

self.navigationController.interactivePopGestureRecognizer.delegate = self;

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return NO;
}
View Code

 

20、NSStringUTF-8編碼解碼  

  
// iOS中對字元串進行UTF-8編碼:輸出str字元串的UTF-8格式
[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

// 解碼:把str字元串以UTF-8規則進行解碼
[str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
View Code

 

21、手勢與tableview事件衝突處理

  
// 在view上添加tag手勢的時候,並且設置tag事件的代理
//然後根據具體的業務場景去寫邏輯就可以了,比如
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    //Tip:我們可以通過列印touch.view來看看具體點擊的view是具體是什麼名稱,像點擊UITableViewCell時響應的View則是UITableViewCellContentView.
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        //返回為NO則屏蔽手勢事件
        return NO;
    }
    return YES;
}
View Code

 

22、ScrollView header懸停  

  
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y >= 50) {
        self.header.frame = CGRectMake(0, 0, 375, 35);
        [self.view addSubview:self.header];
    } else {
        self.header.frame = CGRectMake(0, 50, 375, 35);
        [self.scrollView addSubview:self.header];
    }
}
View Code

 

23、從設備支持的字體中隨機選擇一個

  
     // 從設備支持的字體中隨機選擇一個
    NSString *fontName = @"";
    
    NSUInteger count1 = arc4random() % ([UIFont familyNames].count);
    
    NSString *familyName = [UIFont familyNames][count1];
    
    NSUInteger count2 = [UIFont fontNamesForFamilyName:familyName].count;
    
    fontName = [UIFont fontNamesForFamilyName:familyName][arc4random() % count2];
View Code

 

24、UIFont CGFontRef

  
   // 創建 UIFont 字體
    UIFont *font = [UIFont systemFontOfSize:15];
    
    // 轉換成 CGFontRef
    CFStringRef fontName = (__bridge CFStringRef)font.fontName;
    CGFontRef fontRef = CGFontCreateWithFontName(fontName);
View Code

 

25、字元串轉日期失敗   NSDataFormatter 格式設置:  

  
//You're using the wrong formatter:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy"];
NSDate *startDatePlain=[formatter dateFromString:start];
NSDate *endDatePlain=[formatter dateFromString:end];
    
//You need to use your detailformatter:
NSDateFormatter *detailformatter = [[NSDateFormatter alloc] init];
[detailformatter setDateFormat:@"MM/dd/yyyy"];
NSDate *startDatePlain=[detailformatter dateFromString:start];
NSDate *endDatePlain=[detailformatter dateFromString:end];
    
//You've got the correct format set on detailformatter!
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們對於IOS的瞭解最多應該就是蘋果手機獨有的IOS系統吧,也可以說是單任務管理器,這可以說是一個優勢,但是隨著技術提升IOS慢慢有被超越的趨勢,但是很多大公司還是需要這方面的開發人才,那麼今天我們來談談IOS開發的入門所需要要具備的知識和技能,如果想要成為一個高薪技術人才那麼你們就要努力了。 一基 ...
  • javaMail,是提供給開發者處理電子郵件相關的編程介面。它是Sun發佈的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。我們可以基於JavaMail開發出類似於Microsoft outlook的應用程式。JavaMail是可選包,因此如果需要使用的話你需要首先從java官網上下 ...
  • 1. 下載Charles Proxy 4.1.4版本,百度雲盤下載或去官網下載 2. 安裝後先打開Charles一次(Windows版可以忽略此步驟) 3. 在這個網站(http://charles.iiilab.com/)下載破解文件 charles.jar 4. 替換掉原文件夾里的charles ...
  • UICollectionView實現瀑布流 在iOS中可以實現瀑布流的目前已知的有2種方案: 本文中我們介紹第二種實現方案首先我們需要自定義一個繼承於UICollectionViewLayout的layout,然後需要重寫四個方法: 第一個方法是做一些初始化的操作,這個方法必須先調用一下父類的實現第 ...
  • 1. drawRect: UIView子類重寫 2. drawLayer: inContext: CALayer設置代理 (這是個代理方法) 3. drawInContext: CALayer子類重寫 4. 使用圖形上下文生成圖片: imageContext 儘量避免混用 實現 drawRect : ...
  • 下載更新apk,基本上每個app都需要的功能,來看看吧,肯定有你想要的,以前都是自己寫,近期想藉助第三方的一個庫來做,功能齊全,感覺不錯,記錄使用過程,雖然官方也有使用教程,不過畢竟粗略,網上也能搜到,不過基本都是複製的 首先下載庫,地址改成我們自己的,檢查地址就讓它了,這個根據自己的業務調整,也能 ...
  • Error:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:externalNativeBuildDebug'. > Build command failed. E ...
  • 使用Intent在活動間穿梭(Intent不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據) 1、使用顯式Intent 基於安卓入門1的內容,繼續在ActivityTest項目中再創建一個活動。右擊com.example.administrator.activitytest包->Ne ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...