第一個swift項目

第一個swift項目

最近參加比賽昨天剛剛結束休息一天泡宿舍寫下總結。來總結下我的第一個swift項目,由于之前寫項目都是用的oc,這是第一次寫項目很多swift項目的特性都沒用上(主要就會一點簡單的語法) 這次項目總的來說還是很完美的畢竟是第一次用swift些項目,但是也有些許的不足比如說在做一個界面的時候想用到iOS9推出的堆棧視圖但是由于時間的原因沒有用上用了自己計算的布局勉強應付上了但是效果很是不好啊,還有就是之前說的swift的特性,鏈式 面向協(xié)議都是知道的少之又少。接下來的時間打算好好總結下項目,繼續(xù)學習知識。

在做項目的過程中隨手記錄的(有些是oc的但是swift差不多):

關于隱藏tabbar的三種方法:

1.直接隱藏

// 顯示tabBar
self.tabBarController.tabBar.hidden = NO;
// 隱藏tabBar
self.tabBarController.tabBar.hidden = YES;

2.push的時候設置隱藏常用的尤其是在Nav和tab結合使用的時候

// 在push跳轉時隱藏tabBar
UIViewController *vc2 = [UIViewController new];
vc2.hidesBottomBarWhenPushed = YES;
[vc1 pushViewController:vc2 animated:YES];

3.沒有用過但是感覺很不錯的方法

原理:UITabBarController的subview 共有兩個,一個叫 UITabBar,就是底下的那個 Bar;另一個叫UITranstionview,就是 Bar 上面的視圖。這兩個 view 下面還有其他的subview,這就不用去管它了。把UITabBar的 y 向下移49個單位,把UITranstionview 的 hight 加長 49 個單位。

- (void)hidesTabBar:(BOOL)hidden{
     
     [UIView beginAnimations:nil context:NULL];
     [UIView setAnimationDuration:0];
     
     for (UIView *view in self.tabBarController.view.subviews) {
         if ([view isKindOfClass:[UITabBar class]]) {
             if (hidden) {
                 [view setFrame:CGRectMake(view.frame.origin.x, [UIScreen mainScreen].bounds.size.height, view.frame.size.width , view.frame.size.height)];
                
             }else{
                 [view setFrame:CGRectMake(view.frame.origin.x, [UIScreen mainScreen].bounds.size.height - 49, view.frame.size.width, view.frame.size.height)];
                 
             }
         }else{
             if([view isKindOfClass:NSClassFromString(@"UITransitionView")]){
                 if (hidden) {
                     [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, [UIScreen mainScreen].bounds.size.height)];
                     
                 }else{
                     [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, [UIScreen mainScreen].bounds.size.height - 49 )];
                    
                 }
             }
         }
     }
     [UIView commitAnimations];
     
 }
 
 
 -(void)makeTabBarHidden:(BOOL)hide { // Custom code to hide TabBar
    if ( [self.tabBarController.view.subviews count] < 2 )
    {
        return;
    }
    UIView *contentView; if ( [[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] )
    {
        contentView = [self.tabBarController.view.subviews objectAtIndex:1];
    } else {
            contentView = [self.tabBarController.view.subviews objectAtIndex:0];
    }
    if (hide) {
        contentView.frame = self.tabBarController.view.bounds;
    } else {
            contentView.frame = CGRectMake(self.tabBarController.view.bounds.origin.x, self.tabBarController.view.bounds.origin.y,
                                           self.tabBarController.view.bounds.size.width, self.tabBarController.view.bounds.size.height -
                                           self.tabBarController.tabBar.frame.size.height);
    }
    self.tabBarController.tabBar.hidden = hide;
}


關于swift的協(xié)議問題

1.聲明除了語法與oc幾乎一樣 而且更加簡單
2.在聲明上的區(qū)別

//特殊的聲明方式
@objc protocol FirstViewControllerDelegate: NSObjectProtocol{

optional func firstDelegate(returnString:String)

}

在這個代理的聲明中,可以明顯看出,增加了一些額外的修飾符

1》引入@objc是為了引入 optional(可選),用 optional 修飾代理方法,那么這個方法就變成可選方法,無論在代理對象中是否實現(xiàn),都不受影響。
2》引入 NSObjectProtocol 是因為我們?nèi)绻胗?weak 修飾代理屬性,需要繼承自這個類。

關于切換根視圖(登陸后切換根視圖)

1.在appdelegate中

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];  
   A *vc = [[A alloc] init]; // init會執(zhí)行viewDidLoad viewWillAppear   
   vc.view.backgroundColor  = [UIColor redColor];  
   self.window.rootViewController = vc;  
   [self.window makeKeyAndVisible];  

2.在a中 b設置為根視圖

注意點出來了,如果使用的是presentViewController則在設置B為根控制器的方法就必須在viewDidLoad與viewWillAppear之后進行設置。不然如下

3.在b中設置b為根視圖
(建議在控制器已經(jīng)完全在window上展示再切換window的根控制器)

- (void)viewDidAppear:(BOOL)animated {  
    [super viewDidAppear:animated];  
      
          
    AppDelegate *app = [UIApplication sharedApplication].delegate; // 獲取當前app單例  
  
    NSLog(@"appdelegate is %@",app);  
      
    UIViewController *vc = app.window.rootViewController;  
      
    app.window.rootViewController = self;  
      
    [vc removeFromParentViewController];  
    NSLog(@"當前的根控制器為:%@",self.view.window.rootViewController);  
}  


A.view = nil

對應上面的方法需要將A銷毀減小內(nèi)存的消耗

還有一種方法

方法二:(提供個基本思路,實際情況大家研究下了)

可以創(chuàng)建多個window,在執(zhí)行完成后可以設置其window為self.window,并讓其成為key window,然后只要想使用的話就只可以將self.window賦值想要展示的window可此時銷毀剛才的window,然后再將[self.window makeKeyandVisible];

關于tableView 的cell被遮擋的問題

1.沒有正確設置tableVIew的高度,高度過高

tableview的高度設置有錯誤,應該為self.view.frame.size.hight - self.tabbarController.tabbar.frame.size.height - 64,就可以避免遮擋 

或者

self.automaticallyAdjustsScrollViewInsets = NO 設置后默認tableview 的contentInset = UIEdgeInsetsZero; 否則就是會減去 導航欄 + 底部tababr 高度,如果要從頭開始布局 ,可以使用self.edgesForExtendedLayout = UIRectEdgeTop; 讓tableview 頂部從 0 。0 開始布局,底部自動減去 64 

關于導航欄的問題

  1. self.navigationController?.setNavigationBarHidden(false, animated: true)
  2. 設置viewController的title和設置UItabbarItem的標題
 在寫代碼的時候設計的基類修改標題欄的方法采用的是self.title = navString 但是在實際的使用的中發(fā)現(xiàn),我調(diào)用這個方法的時候出現(xiàn)了在我底部的TABbar產(chǎn)生了一個新的item,當時以為我自定義的tabbar出現(xiàn)了問題但是找了一圈沒找到。。。。然后百度下找到了我想要的一切

self.navigationItem.title
= @"my title"; sets navigation bar title.

self.tabBarItem.title
= @"my title"; sets tab bar title.

self.title
= @"my title"; sets both of these.

關于寫界面的一點提醒

  1. 當寫界面的的時候出現(xiàn)了不符合自己的意圖的樣子,可以進行查看分層和設置背景顏色的方法來進行調(diào)試或者可以frameDebuging(真機)

關于調(diào)用父類方法(調(diào)用自定義tabbar方法)

 let tab = self.navigationController?.tabBarController as! AnimationTabBarController
//        獲取父類的方法
//        print(self.navigationController?.tabBarController?.superclass ?? AnyClass.self)
//        調(diào)用父類的方法
        tab.setSelectIndex(from: 0, to: 2)

關于hidden隱藏時的動畫

let animation = CATransition()
animation.type = kCATransitionFade
animation.duration = 0.4
view.layer.add(animation, forKey: nil)
view.isHidden = false

關于swift數(shù)組切片

1.原網(wǎng)址
嘗試了好幾種辦法但是最終都沒有解決,與這個博客遇到的問題差不多,我遇到的問題是將數(shù)組分成幾個分別出作為數(shù)據(jù)源(因為我寫的蹩腳的接口弄的不會分開)
最終的實現(xiàn)辦法

memberIdStrListToProcess = Array(groupMemberIdStrList[0…9])
要加一個array然后再接片操作跟Python有些不同。(前面加了Array強轉)

關于數(shù)組

1.今天在創(chuàng)建數(shù)組然后從網(wǎng)絡獲取數(shù)據(jù)并添加到數(shù)組的時候出現(xiàn)了問題。。。
我是這樣寫的

var recordData = Array<Array<Any>>()
犯了一個明顯的錯誤。。。沒有進行初始化這是單單的進行了聲明。。因為swift的語法搞得我有點忘記初始化了。。總結下
數(shù)據(jù)數(shù)組 記得創(chuàng)建是要進行初始化(創(chuàng)建類型要: 聲明但是沒有初始化,= ( )這樣是進行初始化并聲明 !) 括號的問題

swift調(diào)用oc的block

1.swift調(diào)用oc的block,遇到這個問題我有點頭大啊。。。oc的block還沒學多好呢。。swift更是差勁現(xiàn)在可以好了直接開始混編了,說正題,解決方法swift調(diào)用ocBlock 總結如下

// oc的block
返回值(^名稱)(類型 傳值)
// swift里調(diào)用
名稱 = {(傳值!!(沒有類型))->(返回值) in 
 
}

2.還有一點之前看的swift調(diào)用不了oc的可選協(xié)議。好像有辦法但是時間緊迫先放過了。()

oc設置導航欄文字富文本顯示

設置富文本將以字典的樣子去設置
[self.navigationController.navigationBar setTitleTextAttributes:

@{NSFontAttributeName:[UIFont systemFontOfSize:19],

NSForegroundColorAttributeName:[UIColor redColor]}];

將圖片轉成base64字符串

let image = UIImage(name:"照片")
//將圖片轉成data
let imageData = UIImagePNGRepresentation(image!)
//將data轉成base64的字符串
let imageBase64String = imageData?.base64EncodeString()
//可以使用base64的字符串類型上傳到服務器了
//還要將base64進行urlencode的話
let imageString = imageBase64String.addingPercentEncoding(withAllowedCharacters: .alphanumerics)

bas64字符串轉成圖片

//將base64的圖片字符串轉成Data
let imageData2 = Data(base64Encoded: imageBase64String!)

//將data轉成照片
let image2 =UIImage(data:imageData2!)
//將data轉成uiimage 
let photo = UIImage(data:image2)

ios11 保存圖片閃退

原文
ios10和ios11 的這個方面的權限有些不同查看博客即可

設置狀態(tài)欄設置

首先放出幾個網(wǎng)上寫的不錯的博客吧ios 狀態(tài)欄statusBar的背景顏色

//設置狀態(tài)欄顏色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
    
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = color;
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
  
    [self setStatusBarBackgroundColor:[UIColor redColor]];
    self.view.backgroundColor = [UIColor yellowColor];
}

swift實現(xiàn)的
還有好多但是不服我的情況我就直接刪除了。。。說下我的情況吧 我的程序運行在ios11 上是完全ok的 但是運行在ios9上狀態(tài)欄莫名的就是黑色的。。。后來發(fā)現(xiàn)是我自定義的導航欄的位置出現(xiàn)了問題 少算了20.。汗顏啊。~

ios 截屏保存相冊(swift)版

文章寫的很好也有很多的地方可以學習

tableView顯示滑動條

self.lazyTableView.showsHorizontalScrollIndicator為顯示橫向的滑動條(Heng)
self.lazyTableView.showsVerticalScrollIndicator
為顯示縱向的滑動條 其實沒必要去記錄的自己試下就可以啦

ios設置返回按鈕的樣子自定義(oc版)

ios修改返回按鈕的幾種方式嘗試了下最后一種方式最好用了,之前的方法都是更改了圖片但是標題沒有發(fā)生改變,采用第三種方法

//創(chuàng)建一個UIButton
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
//設置UIButton的圖像
[backButton setImage:[UIImage imageNamed:@"left_select_img.png"] forState:UIControlStateNormal];
//給UIButton綁定一個方法,在這個方法中進行popViewControllerAnimated
[backButton addTarget:self action:@selector(backItemClick) forControlEvents:UIControlEventTouchUpInside];
//然后通過系統(tǒng)給的自定義BarButtonItem的方法創(chuàng)建BarButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//覆蓋返回按鍵
self.navigationItem.leftBarButtonItem = backItem;

等間距布局(堆棧視圖)

masonry等間距布局

PHP的數(shù)組

1.首先是數(shù)組支持的類型,PHP的數(shù)組有兩種類型,第一種只保存值的索引數(shù)組,另一種是保存名值對(name/key)關聯(lián)數(shù)組(類似其他語言的字典)

Linux導入數(shù)據(jù)庫

之前有用過但是又忘記了。。在此記錄下吧首先導出所需要的數(shù)據(jù)庫,我用的是Navicat直接右鍵導出就OK了,然后是在服務器上導入,服務器為centos導入方法有兩種。第一種方法:

選擇數(shù)據(jù)庫
mysql>use abc;
設置數(shù)據(jù)庫編碼
mysql>set names utf8;
導入數(shù)據(jù)(注意sql文件的路徑)
mysql>source /home/abc/abc.sql;
第二種方法(常用方法)

方法二(常用):

    格式:mysql -u用戶名 -p密碼 數(shù)據(jù)庫名 < 數(shù)據(jù)庫名.sql 
    舉例:mysql -uabc_f -p abc < abc.sql

順便記錄下導出的方法:

一、導出數(shù)據(jù)和表結構:

格式: mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫名 > 數(shù)據(jù)庫名.sql 
舉例: /usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql 
敲回車后會提示輸入密碼

二、只導出表結構

格式:mysqldump -u用戶名 -p密碼 -d 數(shù)據(jù)庫名 > 數(shù)據(jù)庫名.sql 
舉例:/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql 
注:/usr/local/mysql/bin/ —> mysql的data目錄

遇到的重大問題

1.自定義tabbar總是出問題 最終是修改一個屬性解決的
2.方法前面加objc
3.持續(xù)更新 繼續(xù)干找問題記錄下來 學習 研究 抽時間

總結

1.第一次用些swift些項目,第一次用PHP做了些簡單的app的接口~總的來說還是很開心的

后記

1.iOS oc方面:kvo屬性監(jiān)聽,通知的寫法,block的用法,了解runtime,wkwebView有很多的知識點
iOS swift方面: swift閉包知識,wkwebView有很多的知識點,事件的分發(fā)機制,通知,學習rxswift swift 閉包的使用
2.學習工具: sketch還有和他配好寫動畫的叫。。。
3.學習控件堆棧視圖:UIStackView UIStackView Intrinsic Content Size
4.學習了解本地數(shù)據(jù)庫 realm charts(畫圖)點的擬合
5.后續(xù)將這些東西的學習筆記和demon上傳

總結下

上面的都是在所項目的時候記錄的一些東西,接下來的一個月里面有幾件事情要去忙首先是參加cccc然后是小程序再有就是將這個項目繼續(xù)完成升級,然后學習上面提到的東西。陸續(xù)我要記錄下我學習的這些知識。 好了就這樣了,最后分享下項目吧 GitHub項目地址()

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 2017年3月,不明真相的我被南子拉入一個群里,然后開始“100天~每天1小時做自己”的活動。這是第一次沒有作好...
    懶蟲子的美麗人生閱讀 326評論 0 3
  • 1. 里面還有reset.css文件,重置默認樣式 2. 解決窗口縮小時,拖動滾動條會出現(xiàn)空白區(qū)域 mi...
    大佬肥1閱讀 186評論 0 0
  • 當一件事情你很清楚當下必須要做,而沒有做。然后做了一件當下沒有價值的事情,產(chǎn)生的情緒理解為懊惱。 我有很多...
    劉亞琴閱讀 211評論 0 0
  • 年輕的時候,我們都曾以為十年是好長的一段時光,我們都曾憧憬自己十年之后的樣子。然而,時光匆匆,屈指數(shù)來我們聽《十年...
    橙維維閱讀 3,018評論 0 3