iOS學習筆記

  1. autoLayout

Autolayout的作用非常明確:幫我們確定在不同設備、不同(父view)環境下,同一個可視單元所應具有合適的位置和尺寸,因此,當一個UIView上所施加的約束能夠唯一確定它的frame(x, y, width, height)的時候我們的自動布局的使用才是正確的。而新手通常犯的兩類錯誤就是約束不足(約束太少)和約束沖突兩種(約束太多)。如果你給出的約束只能夠確定這個view的大小,或者位置或者位置中的某一個項(比如x)的時候,就會出現約束不足的情況,在xib或者storyboard中,會以黃色的警告出現在左側提示框內;如果你給出的約束推導出了兩個甚至多個互相矛盾的位置尺寸結果的時候,就產生了布局錯誤,在編譯的時候直接就build不過。

  1. 在畫布中角度是順時針轉的


    angle
  2. 引用

在繪制的方法中,使用 UIGraphicsBeginImageContextWithOptions 來取代 UIGraphicsGetCurrentContext 出處

  1. 應用間相互調用只要知道雙方設置好的URL就行了,打開另一個應用時可以把當前應用的URL傳過去,要打開的應用就可以根據響應的代碼就可以讓用戶觸發返回原始應用了

  2. 事件的響應鏈是從子視圖到父視圖層層傳遞的,模式是子視圖調用父視圖相同的方法([super XXX]),所以觸發該事件的先后順序應該是從父視圖到子視圖,當然這是默認情況,如果你重寫了事件方法,就可以控制是否把事件傳遞給父視圖,或者哪個視圖先觸發事件
    上面的理解貌似不夠準確,重新整理如下:
    . 事件鏈的建立 簡單講是發生在addSubView時,被添加的視圖的nextResponder(下一個響應者)就是它的父視圖。如果一個veiw(下面簡稱A)不是普通的view,它是某個viewcontroller的根veiw,那么A的nextResponder在A從初始化完后就賦值為viewController。然后當A被addsubview到rootview的時候(addChildViewController時會發生),Controller A的nextresponder被復制為rootview。
    . 事件的傳遞 當用戶觸摸時,UIKit先創建一個事件對象,加到事件隊列中去,然后UIAPPlication從中取出來,從window開始查找,發現點擊位置在window的范圍內,那就繼續查找window的subViews,直到找到視圖樹最頂部的葉子視圖,然后把事件交給這個頂部視圖,視圖處理事件,如果不處理就交給它的nextResponser,層層往下,直到window再到UIApplacation。

  3. 像素就是一個小點,px就表示一個真正的點,pt就是標準中定好的有大小的點,1/72英寸,分辨率是指指每單位面積(平方英寸)像素的個個數,即dpi,之所以談到具體的設備時經常用W*H表示分辨率,是用了當前設備的長寬方向上的像素除以當前設備相應的尺寸

  4. devices只有選擇了universal(通用)才可以讓iPhone和iPad共用界面或者說不同尺寸的設備共用界面

  5. IQKeyboardManager 必須是在push或者present的VC的視圖上才可以自動調整位置 事后問過作者,說怎么都可以,但是我用的版本卻實不行,作者給意見,可以考慮addChildViewCOntroller

  6. 從UINavigationController里出來的UIViewController無法不會執行shouldAutorotate,這種情況必須自定義一個繼承UINavigationController的類

  7. 要實現UITableViewCell的編輯必須實現下面兩個方法
    (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
    (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

  8. 關于堆棧的理解 :棧 — 戰死 棧是死的,一般是提前分配好的,除非你malloc出來,堆的可控性就比較強,也就是自己控制它的創建,當然它的消亡也應該你來控制
    舉個小栗:在一個函數中定義了 NSArray *a = [[NSArray alloc] init] a是個指針,他就是放在棧中的,但是它指向的那個數組就是存在堆中的。

  9. objective-c因為字符串比較特殊,所以在寫正則的時候,碰到轉義字符必須多加一個”\\”,比如:全數字字符:@"^\\\\d\\+$"

  10. UITableView竟然被我發現了一個新用法(當然這個用法是舊的),它在編輯狀態下可以左邊顯示圓圈,didSelected會自動選中,再按一次didDeselect會自動消失

  11. 下面這句話的意思是獲取aView在window中的位置,注意最前邊是aView的父視圖
    [aView.superview convertPoint:aView.frame.origin toView:nil];

  12. UIView不能同事加多個由make生成的transform,如果加多個,第二個應該用原始方法,如下
    self.contentViewContainer.transform = CGAffineTransformMakeTranslation(point.x, 0);
    self.contentViewContainer.transform = CGAffineTransformScale(self.contentViewContainer.transform,scale, scale);

  13. extern 是表明這個這個變量是全局的,在其他類里也可以使用這個變量不必把首次聲明這個變量的類引入就行,但是必須得再次聲明,static是僅限于此類里使用,其他類要想使用必須引入該類

  14. 圖片的坐標原點在左下角

  15. 關于刷新子視圖

-layoutSubviews方法:這個方法,默認沒有做任何事情,需要子類進行重寫
-setNeedsLayout方法: 標記為需要重新布局,異步調用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定會被調用
-layoutIfNeeded方法:如果,有需要刷新的標記,立即調用layoutSubviews進行布局(如果沒有標記,不會調用layoutSubviews)
如果要立即刷新,要先調用[view setNeedsLayout],把標記設為需要布局,然后馬上調用[view layoutIfNeeded],實現布局

  1. 我勒個去哎,self.navigationController.toolbarHidden = NO 這樣可以在View下邊有顯示一個toolbar哎,這個是可以利用的喲,完成任務必須抽時間好好研究一番,新發現啊

  2. 下面的代碼輸出什么
    @implementation Son : Father
    - (id)init{
    self = [super init]; if (self) {
    NSLog(@"%@", NSStringFromClass([self class]));
    NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
    }
    @end

答案:都輸出”Son”解釋:objc中super是編譯器標示符,并不像self一樣是一個對象,遇到向super發的方法時會轉譯成objc_msgSendSuper(...),而參數中的對象還是self,于是從父類開始沿繼承鏈尋找- class這個方法,最后在NSObject中找到(若override)此時,[self class]和[super class]已經等價了。

所以,子類調用父類的某個方法,父類的這個方法又調用了一個跟子類有相同名字的某個方法,相當于子類直接調用了這個方法

  1. UITextField是有leftView和rightView的,可以利用leftView在添加了背景圖片后添加左邊留白,但是得注意要設置屬性
    leftViewMode = UITextFieldViewModeAlways

  2. load方法會在類實例話的時候調用,如果要用runtime黑魔法的話就可以在這里用。initializer方法會在第一次調用該類的方法時調用這個方法,屬于懶加載

  3. UITableView的header是searchBar的時候拖拽時searchBar背景會被拉伸

  4. 視圖控制器切換方法
    - (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);
    不用你再去給容器視圖添加(addSubView)和刪除(removeFromSuperView)子視圖,它會幫你處理好

  5. 哈哈哈,XCode好傻喲,如果你在.m文件里提前有了 setX和x方法,然后才在.h文件里用@property聲明x屬性,.m里就不允許你使用_x這個變量。此時,@synthesize 就派上了用場。@dynamic@synthesize的區別在于:使用@synthesize編譯器會確實的產生getter和setter方法,而@dynamic僅僅是告訴編譯器這兩個方法在運行期會有的,無需產生警告。

假設有這么個場景,B類,C類分別繼承A類,A類實現某個協議(@protocol),協議中某個屬性( somePropety )我不想在A中實現,而在B類,C類中分別實現。如果A中不寫任何代碼,編譯器就會給出警告:
“use @synthesize, @dynamic or provide a method implementation"
這時你給用@dynamic somePropety; 編譯器就不會警告,同時也不會產生任何默認代碼。

  1. UITableView在編輯狀態下如果指定編輯樣式是添加和刪除,可以在視圖上顯示復選框,利用這個特性可以方便實現多選。
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
    }
    注意:以上是在UITableView單選的情況下,如果是多選就會自動出現復選框,不會執行上段代碼。??說了好多廢話喲

  2. UITableView在調用了reloadData之后,tableView會在調用完cell的高度獲知contentSize之后就調用reloadData之后的語句了,完了之后才去加載cell

  3. 在 MRC 下,使用 __block 說明符也可以避免循環引用。因為當 block 從棧拷貝到堆時,__block 對象類型的變量不會被 retain,沒有 __block 說明符的對象類型的變量則會被 retian。正是由于 __block 在 ARC 和 MRC 下的巨大差異,我們在寫代碼時一定要區分清楚到底是 ARC 還是 MRC。

  4. 實現下面的方法,我們就可以對一個類進行使用想NSArray和NSDictionary那樣的語法糖用下標或者key來存取數據了, so cool

    - (id)objectAtIndexedSubscript:(NSUInteger)idx;
    - (void)setObject:(id)objatIndexedSubscript:(NSUInteger)idx;
    - (void)setObject:(id)objforKeyedSubscript:(id <NSCopying>)key;
    - (id)objectForKeyedSubscript:(id)key;
    
  5. CALayer的border是出現在layer內部的,比如說layerWidth為10,那么border就會占據layer的content的四周寬度為10的空間。

  6. 系統視頻的上傳必須拷貝到沙盒目錄中才能上傳。??

  7. 手擼NSLayoutConstraint需要注意firstItem和secondItem的順序

  8. 注意了,注意了,keyWindow不知道什么時候會被系統干掉,所以把hud加在keyWindow上的時候一定要注意哦。最近遇到的在把mov轉換成mp4的時候系統起了個異步線程,然后kenWindow就被干掉了。

  9. 用CGContextClearRect就可以實現畫一張中間透明的圖片了。

  10. 想知道某個變量在程序調試時的狀態,可以用借助dispatch_source_t 監控調試開始,打印變量 from

    dispatch_queue_t queue = dispatch_get_main_queue();
    static dispatch_source_t source = nil;
    __typeof(self) __weak weakSelf = self;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        source = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGSTOP, 0, queue);
        if (source)
        {
            dispatch_source_set_event_handler(source, ^{
                NSLog(@"Hi, I am: %@", weakSelf);
            });
            dispatch_resume(source); // 10
        }
    });
    
  11. 當UINavigationController push或者pop操作時NavigationBar右側底部會變灰,解決這種問題需要把最接近當前vc的view的view的背景色修改一下就可以了。

Paste_Image.png
  1. 企業賬戶 往App Store上發布應用必須是Agent賬戶
  2. 用Xcode寫C,即使僅僅有C也要把Compile Sources As改為Objective C++
  3. 我一直以為下邊的代碼是默認的,然而并不是,需要明確寫出來。??
    self.tableView.rowHeight = UITableViewAutomaticDimension;
  4. CALayer對path的動畫執行完后path為初始值,如果想要最后停留住狀態就可以把初始值設為toValue的值
  5. iOS11的本地通知要想在前臺顯示必須實現代理willPresent的方法,文檔有說明的,記住
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容