UI基礎和UIView

為了學習相關的原理,使用Empty Application模板建立工程;
在開始輸入正常學習的代碼之前,要先:
1、將ARC關閉;
2、將AppDelegate.h文件中的屬性聲明里的strong改為retain,并在AppDelegate.m文件中重寫dealloc方法;
3、在application:didFinishLaunchingWithOptions:方法中定義一個UIViewController,并設為根視圖控制器;
Xcode7之后,沒有根視圖控制器程序會崩潰,根視圖控制器也會被添加到父視圖的數組中,為了不影響我們操作view,將根視圖控制器寫在最后面

用宏定義將常用的數據比如屏幕寬高等,設為宏;
擴充自己的庫;
總是忘記設置背景顏色以及將view放到相應的父視圖中;
frame要根據父視圖的坐標系設置;

在設置好了origin之后改變size時,不是以view中心為參照進行縮放;
盡量不要用center的setter方法來設置view的位置

在設置屬性時用self.的setter方法使retainCount+1
在開辟空間的時候retainCount由0變1
所以屬性的引用計數是2
需要在放入父類之后對實例方法執行一次release一次

定義好window后要將它設為key和可見;

[self.window makeKeyAndVisible];

創建window

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//[UIScreen mainScreen].bounds 返回的是手機屏幕的frame屬性;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];

創建視圖

UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.window addSubview:aView];

背景色

方法1

aView.backgroundColor = [UIColor redColor];

方法2

aView.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];

我們工作后一般用的是這種方法,可以用RGB值來設定顏色,因為工作時僅靠方法1中的幾種顏色已經無法滿足我們的需求
colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue;
填入的顏色數據通常以n/255.0的形式來表現,n就是RGB值;
隨機顏色

aView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 
                                        green:arc4random()%256/255.0 
                                         blue:arc4random()%256/255.0];

ps:加.0是因為兩個整數做除法只能生成整數

根據父視圖取子視圖

UIView *v = [[UIView alloc] init];
[self.window addSubview:v];
UIView *a = self.window.subviews[0];

subviews返回的是一個子視圖數組,可以用數組取值的方式按順序取出子視圖;

根據子視圖取父視圖

UIWindow *tempView = (UIWindow*)v.superview;

因為superview方法返回的是UIView類型的對象,所以如果父視圖是window的話需要強轉;
或者直接用UIView類型的指針來指向UIWindow的對象也可以,這就是OC的多態;

透明度,隱藏,刪除

UIView *tempSuperview = [[UIView alloc] init];
UIView *tempSubview = [[UIView alloc] init];
[self.window addSubview:tempSuperview];
[tempSuperview addSubview:tempSubview];

tempSuperview.alpha = 0.5;
//設置父視圖的透明度后,子視圖也會相應透明,但子視圖的alpha屬性沒變,如果子視圖的alpha屬性<1,那么子視圖位置會顯示和父視圖融合后的背景色,否則顯示的是和父視圖相同的透明度的效果;
tempSuperview.hidden = YES;
//父視圖設置隱藏屬性為YES后,子類也會隱藏,但子類的隱藏屬性不變
[tempSuperview removeFromSuperview];
//父視圖被從爺視圖刪除后,子視圖也會消失;
//將被刪除的父視圖添加回來后,發現子視圖也在;

改變子視圖的位置

這幾個改變位置的方法只能對自己的子視圖用;

[self.window addSubview:tempSubview];//子視圖在已經添加在父視圖的情況下,被添加到爺視圖上后,父視圖中的子視圖會被自動刪除;
//這個應該是在蘋果的內部實現中設置的;
[self.window insertSubview:tempSubview aboveSubview:tempSuperview];
//把XX移動到XX下面;
[self.window insertSubview:tempSubview belowSubview:tempSuperview];
//把XX移動到XX上面;
//這樣改變位置后,數組下標會發生改變,說明誰壓著誰和數組的排序是一個聯動關系;
[self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
//交換兩個子視圖的下標
[self.window bringSubviewToFront:tempSuperview];
//將XX帶到最前面;
[self.window sendSubviewToBack:tempSuperview];
//將XX發送到最后面;

bounds

bounds返回的是一個CGRect類型的結構體,前兩個值是指視圖頂點對于它自身坐標系的位置,后兩個值是視圖的size;
改變bounds的前兩個點的數據不會改變視圖本身的位置,但會使視圖自身的坐標系原點發生改變量的相對位移,由于坐標系原點被改變了,相對于這個原點所設置的子視圖的位置也會被改變;
所以這是一種一次性操作所有子視圖的方法,雖然只是位置,但我想在某些情況下會產生指導意義;

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

推薦閱讀更多精彩內容