亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS開發筆記-基礎UI(6)照片瀏覽器(控件的懶加載和使用Plist文件將數據與代碼分離)

2019-11-14 19:29:55
字體:
來源:轉載
供稿:網友

使用UIImageView、UILabel、UIButton實現一個綜合小案例

功能分析

(1)點擊箭頭切換序號、圖片、描述
(2)如果是首張圖片,左邊箭頭不能點擊
(3)如果是尾張圖片,右邊箭頭不能點擊

步驟分析

(1)搭建UI界面
(2)監聽按鈕點擊

切換序號、圖片、描述

 

1. 界面分析

1> 需要讀取或修改的屬性的控件

// 序號標簽

// 圖片

// 圖片描述

// 左邊按鈕

// 右邊按鈕

2> 需要監聽響應事件的對象,需要添加監聽方法

// 左邊按鈕

// 右邊按鈕

uiimage 是圖片,不是控件,他的父類為NSObject,UIImageView是加載圖片的控件,父類為UIView

完全的代碼編寫界面(復習回憶)

#import "ViewController.h"@interface ViewController ()//序號標簽@PRoperty (nonatomic, strong) UILabel *noLabel;//圖片@property (nonatomic, strong) UIImageView *icon;//圖片描述@property (nonatomic, strong) UILabel *descLabel;//左邊按鈕@property (nonatomic, strong) UIButton *leftButton;//右邊按鈕@property (nonatomic, strong) UIButton *rightButton;@end@implementation ViewController//初始化工作//viewDidLoad是視圖加載完成后調用的方法,通常在此方法中執行視圖控制器的初始化工作- (void)viewDidLoad {    [super viewDidLoad];    //實例化控件    //1、序號標簽的編寫    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 320, 40)];    label.text = @"1/5";    //居中對齊    label.textAlignment = NSTextAlignmentCenter;    [self.view addSubview:label];    //記錄改變    self.noLabel = label;        //2、圖片控件    CGFloat imageW = 200;    CGFloat imageH = 200;    CGFloat imageX = (320 - imageW) / 2;    CGFloat imageY = 80;    //實例化一個圖像視圖    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(imageX, imageY, imageW, imageH)];    //實例化一個圖像    UIImage *image = [UIImage imageNamed:@"biaoqingdi"];    //把圖片顯示到imageView    imageView.image = image;    [self.view addSubview:imageView];    //記錄下改變    self.icon = imageView;        //3、圖片描述 label 控件    UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 300, 300, 80)];    label1.text = @"發發發";    //居中對齊    label1.textAlignment = NSTextAlignmentCenter;    [self.view addSubview:label1];    //記錄改變    self.descLabel = label1;        //4、左邊的按鈕    UIButton *leftBtn = [[UIButton alloc] init];    //設置按鈕的背景圖    [leftBtn setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal];    [leftBtn setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted];    //設置按鈕的大小    leftBtn.frame = CGRectMake(0, 0, 40, 40);    //設置按鈕的位置    leftBtn.center = CGPointMake(self.icon.frame.origin.x / 2, self.icon.center.y);        [self.view addSubview:leftBtn];    self.leftButton = leftBtn;        //5、右邊的按鈕    UIButton *rightBtn = [[UIButton alloc] init];    //設置按鈕的背景圖    [rightBtn setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal];    [rightBtn setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted];    //設置按鈕的大小    rightBtn.frame = CGRectMake(0, 0, 40, 40);    //設置按鈕的位置    rightBtn.center = CGPointMake(self.view.frame.size.width - self.icon.frame.origin.x / 2, self.icon.center.y);        [self.view addSubview:rightBtn];    self.leftButton = rightBtn;}@end

完整的代碼如下:

#import "ViewController.h"@interface ViewController ()//序號標簽@property (nonatomic, strong) UILabel *noLabel;//圖片@property (nonatomic, strong) UIImageView *icon;//圖片描述@property (nonatomic, strong) UILabel *descLabel;//左邊按鈕@property (nonatomic, strong) UIButton *leftButton;//右邊按鈕@property (nonatomic, strong) UIButton *rightButton;//圖片索引,index默認是0@property (nonatomic, assign) int index;/**設置一個圖像的數組*///新的注釋,可以顯式中文@property (nonatomic, strong) NSArray *imageList;/* @property  自動為我們生成 set,get 方法的聲明和實現 帶下劃線的成員變量 */@end@implementation ViewController//控件懶加載//不需要每次都在 viewdidload 里實例化數組,只要在需要的時候實例化即可//重寫 get 方法- (NSArray *)imageList{    //只有第一次調用imageList 的 getter 方法的時候,如果為空,那么再實例化并建立數組,其他時候,直接返回成員變量    if (_imageList == nil) {        //使用字典        NSDictionary *dict1 = @{@"name" : @"biaoqingdi", @"desc" : @"表情"};        NSDictionary *dict2 = @{@"name" : @"bingli", @"desc" : @"病歷"};        NSDictionary *dict3 = @{@"name" : @"chiniupa", @"desc" : @"吃牛扒"};        NSDictionary *dict4 = @{@"name" : @"danteng", @"desc" : @"蛋疼"};        NSDictionary *dict5 = @{@"name" : @"wangba", @"desc" : @"王八"};                self.imageList = @[dict1, dict2, dict3, dict4, dict5];    }        return _imageList;}//初始化工作//viewDidLoad是視圖加載完成后調用的方法,通常在此方法中執行視圖控制器的初始化工作- (void)viewDidLoad {    [super viewDidLoad];    //實例化控件    //1、序號標簽的編寫    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 320, 40)];  //  label.text = @"1/5";    //居中對齊    label.textAlignment = NSTextAlignmentCenter;    [self.view addSubview:label];    //記錄改變    self.noLabel = label;        //2、圖片控件    CGFloat imageW = 200;    CGFloat imageH = 200;    CGFloat imageX = (320 - imageW) / 2;    CGFloat imageY = 80;    //實例化一個圖像視圖    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(imageX, imageY, imageW, imageH)];    //實例化一個圖像   // UIImage *image = [UIImage imageNamed:@"biaoqingdi"];    //把圖片顯示到imageView   // imageView.image = image;    //把圖像增加到 view    [self.view addSubview:imageView];    //記錄下改變    self.icon = imageView;        //3、圖片描述 label 控件    UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 300, 300, 80)];   // label1.text = @"發發發";    //居中對齊    label1.textAlignment = NSTextAlignmentCenter;    [self.view addSubview:label1];    //記錄改變    self.descLabel = label1;        //4、左邊的按鈕    UIButton *leftBtn = [[UIButton alloc] init];    //設置按鈕的背景圖    [leftBtn setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal];    [leftBtn setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted];    //設置按鈕的大小    leftBtn.frame = CGRectMake(0, 0, 40, 40);    //設置按鈕的位置    leftBtn.center = CGPointMake(self.icon.frame.origin.x / 2, self.icon.center.y);    [self.view addSubview:leftBtn];    //設置監聽    [leftBtn addTarget:self action:@selector(leftClick) forControlEvents:UIControlEventTouchUpInside];    self.leftButton = leftBtn;        //5、右邊的按鈕    UIButton *rightBtn = [[UIButton alloc] init];    //設置按鈕的背景圖    [rightBtn setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal];    [rightBtn setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted];    //設置按鈕的大小    rightBtn.frame = CGRectMake(0, 0, 40, 40);    //設置按鈕的位置    rightBtn.center = CGPointMake(self.view.frame.size.width - self.icon.frame.origin.x / 2, self.icon.center.y);        [self.view addSubview:rightBtn];        //設置監聽    [rightBtn addTarget:self action:@selector(rightClick) forControlEvents:UIControlEventTouchUpInside];    self.rightButton = rightBtn;        [self change];}- (void)change{    //更具 self.index 來顯示序號標簽,圖形,,描述    self.noLabel.text = [NSString stringWithFormat:@"%d / %d", self.index + 1, 5];    self.icon.image = [UIImage imageNamed:self.imageList[self.index][@"name"]];    self.descLabel.text = self.imageList[self.index][@"desc"];        self.leftButton.enabled = (self.index != 0);    self.rightButton.enabled = (self.index != 4);}//left- (void)leftClick{    self.index--;    [self change];}//right- (void)rightClick{    self.index++;    [self change];}@end

 

小結:

/**設置一個圖像的數組*/

這是 xcode 的新的注釋,鼠標浮動時,可以顯式出中文注釋。

 

手碼懶加載創建控件的步驟

1> 定義控件屬性,注意:屬性必須是strong的,如下:

@property (nonatomic, strong) UIImageView *icon;

 

2> 在屬性的getter方法中實現懶加載。

 

使用懶加載的好處

1> 不必將創建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強

2> 每個控件的getter方法中分別負責各自的實例化處理,代碼彼此之間的獨立性強,松耦合

 

按鈕的狀態

normal(普通狀態)
默認情況
對應的枚舉常量:UIControlStateNormal
 
highlighted(高亮狀態)
按鈕被按下去的時候(手指還未松開)
對應的枚舉常量:UIControlStateHighlighted
 
disabled(失效狀態,不可用狀態)
如果enabled屬性為NO,就是處于disable狀態,代表按鈕不可以被點擊
對應的枚舉常量:UIControlStateDisabled
 

使用Plist文件重構本項目代碼:

目的:將數據與代碼分離(類似 java 里的 xml 文件寫數據,數據和代碼分離)

之前的代碼,尤其是字典那部分,還是處理的不好,顯得太耦合。需要把數據和代碼分離,這里學習屬性列表文件,property list

新建file

本地文件,也可以網絡上解析 xml 文件

 

這樣,只需要修改對應的 xml 文件即可,不用再打開代碼,修改代碼

//控件懶加載//不需要每次都在 viewdidload 里實例化數組,只要在需要的時候實例化即可- (NSArray *)imageList{    //只有第一次調用imageList 的 getter 方法的時候,如果為空,那么再實例化并建立數組,其他時候,直接返回成員變量    if (_imageList == nil) {        //bundle 包的概念  只讀        NSString *path = [[NSBundle mainBundle] pathForResource:@"imageDate" ofType:@".plist"];        NSLog(@"%@", path);        //File 表示從完整路徑查找文件        _imageList = [NSArray arrayWithContentsOfFile:path];    }        return _imageList;}

小結:

1、將數據與代碼分離,Plist 文件的加載方法:

直接將數據直接寫在代碼里面,不是一種合理的做法。如果數據經常改,就要經常翻開對應的代碼進行修改,造成代碼擴展性低,因此,可以考慮將經常變的數據放在文件中進行存儲,程序啟動后從文件中讀取最新的數據。如果要變動數據,直接修改數據文件即可,不用修改代碼。
一般可以使用屬性列表文件存儲NSArray或者NSDictionary之類的數據,這種屬性列表文件的擴展名是plist,因此也成為“Plist文件”

NSString *path = [[NSBundle mainBundle] pathForResource:@"ImageData" ofType:@"plist"];

_imageList = [NSArray arrayWithContentsOfFile:path];

提示:通常在方法中出現File字眼,通常需要傳遞文件的全路徑作為參數,如下全路徑:

/Users/dashuai/Library/Developer/CoreSimulator/Devices/83C611C9-DE98-4D02-BC64-D31C0403766E/data/Containers/Bundle/application/E04713CF-A9D4-49D1-A934-B4093BCE5B3C/圖片瀏覽.app/imageDate.plist

 

2、要想讓UILabel自動換行,設置Lines為0即可。

 

3、UIButton和UIImageView

相同點
都能顯示圖片
 
不同點
UIButton默認情況就能監聽點擊事件,而UIImageView默認情況下不能
UIButton可以在不同狀態下顯示不同的圖片
UIButton既能顯示文字,又能顯示圖片
 
如何選擇
UIButton:需要顯示圖片,點擊圖片后需要做一些特定的操作
UIImageView:僅僅需要顯示圖片,點擊圖片后不需要做任何事情
 
NSArray和NSDictionary的使用
當圖片內容非常多時,“根據index來設置內容”的代碼就不具備擴展性,要經常改動,為了改變現狀,可以考慮將圖片數據保存到一個數組中,數組中有序地放著很多字典,一個字典代表一張圖片數據,包含了圖片名、圖片描述

@property (strong, nonatomic) NSArray *images;

由于只需要初始化一次圖片數據,因此放在get方法中初始化,將屬性放在get方法中初始化的方式,稱為“懶加載”/”延遲加載”

 

/**設置一個圖像的數組*/

這是 xcode 的新的注釋,鼠標浮動時,可以顯式出中文注釋。

 

手碼懶加載創建控件的步驟

1> 定義控件屬性,注意:屬性必須是strong的,如下:

@property (nonatomic, strong) UIImageView *icon;

 

2> 在屬性的getter方法中實現懶加載。

 

使用懶加載的好處:

1> 不必將創建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強

2> 每個控件的getter方法中分別負責各自的實例化處理,代碼彼此之間的獨立性強,松耦合

 

按鈕的狀態

normal(普通狀態)
默認情況
對應的枚舉常量:UIControlStateNormal
 
highlighted(高亮狀態)
按鈕被按下去的時候(手指還未松開)
對應的枚舉常量:UIControlStateHighlighted
 
disabled(失效狀態,不可用狀態)
如果enabled屬性為NO,就是處于disable狀態,代表按鈕不可以被點擊
對應的枚舉常量:UIControlStateDisabled 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
98视频在线噜噜噜国产| 在线成人免费网站| 色哟哟亚洲精品一区二区| 欧美视频不卡中文| 国产午夜精品免费一区二区三区| 久久精品国产清自在天天线| 亚洲一区www| 成人免费网视频| 久久夜色撩人精品| 亚洲国产97在线精品一区| 久久久久久国产精品美女| 中文字幕久精品免费视频| 久久久亚洲欧洲日产国码aⅴ| 精品久久久久久电影| 日韩成人在线电影网| 成人春色激情网| 欧美电影免费观看网站| 91久久久久久久一区二区| 成人网址在线观看| 亚州成人av在线| 国产日韩综合一区二区性色av| 91九色国产社区在线观看| 亚洲香蕉av在线一区二区三区| 亚洲图片制服诱惑| 国产亚洲精品久久久久久777| 亚洲一区二区三区乱码aⅴ| 亚洲小视频在线观看| 欧美中文在线字幕| 久久久国产精彩视频美女艺术照福利| 91色视频在线导航| 亚洲美女中文字幕| 亚洲天堂第二页| 亚洲精品美女在线观看播放| 欧美成人免费小视频| 国产欧美精品在线播放| 亚洲国产欧美一区二区三区久久| 国产精品吊钟奶在线| 欧美多人爱爱视频网站| 精品无人区太爽高潮在线播放| 亚洲精品在线不卡| 欧美三级免费观看| 国产v综合v亚洲欧美久久| 成人激情视频在线观看| 性色av一区二区三区在线观看| 国产精品亚洲аv天堂网| 91av在线影院| 亚洲人成在线一二| 国产成人+综合亚洲+天堂| 亚洲欧美日本伦理| 亚洲qvod图片区电影| 国产精品视频公开费视频| 国产成人精品免高潮费视频| 少妇久久久久久| 国产精品精品国产| 国产精品视频播放| 亚洲第一精品夜夜躁人人爽| 成人久久18免费网站图片| 久久福利网址导航| 亚洲精品中文字幕有码专区| 欧美午夜激情在线| 日本中文字幕不卡免费| 丝袜一区二区三区| 国产丝袜一区视频在线观看| 色偷偷偷亚洲综合网另类| 亚洲国产91精品在线观看| 欧美午夜宅男影院在线观看| 欧美色播在线播放| 欧美黑人国产人伦爽爽爽| 日韩av影片在线观看| y97精品国产97久久久久久| 91国产视频在线| 伊人久久男人天堂| 51久久精品夜色国产麻豆| 欧美激情久久久| 欧美小视频在线| 国产一区二区三区在线观看网站| 亚洲香蕉成视频在线观看| 国产精品一二区| 精品国产91久久久久久| 亚洲天堂网在线观看| 欧美精品免费看| 日韩免费在线电影| 国产精品视频地址| 久久中文精品视频| 亚洲成在人线av| 97精品在线视频| 91日本视频在线| 精品视频久久久久久| 久久精品视频中文字幕| 青青草国产精品一区二区| 国内精品视频一区| 亚洲欧美国产精品专区久久| 国产中文日韩欧美| 亚洲精品免费在线视频| 国模精品一区二区三区色天香| 久久精品国产亚洲精品2020| 成人疯狂猛交xxx| 日本一本a高清免费不卡| 欧美日本黄视频| 在线视频欧美日韩精品| 国产精品99久久久久久白浆小说| 国产视频精品免费播放| 欧美理论片在线观看| 日韩电影免费观看中文字幕| 日韩在线高清视频| 深夜福利亚洲导航| 91夜夜揉人人捏人人添红杏| 琪琪亚洲精品午夜在线| 国产成人精品免费久久久久| 亚洲人午夜精品| 国产精品中文久久久久久久| 正在播放亚洲1区| 欧美精品一区二区免费| 欧美老女人在线视频| 亚洲午夜精品久久久久久久久久久久| 亚洲新中文字幕| 日韩黄色高清视频| 国产va免费精品高清在线观看| 亚洲成人av中文字幕| 亚洲剧情一区二区| 欧美激情精品久久久| 2021久久精品国产99国产精品| 国外日韩电影在线观看| 国产精品毛片a∨一区二区三区|国| 亚洲精品网站在线播放gif| 亚洲一区亚洲二区亚洲三区| 国产精品精品国产| 2019精品视频| 欧美激情精品在线| 亚洲精品久久在线| 日韩欧美成人精品| 亚洲第一级黄色片| 91久久精品国产91久久性色| 久久成年人视频| 久久久久久久久久久久久久久久久久av| 美日韩精品免费视频| 亚洲成人精品视频在线观看| 久久久久久久久久亚洲| 亚洲精品国产精品国产自| 亚洲午夜久久久久久久| 91美女片黄在线观看游戏| 亚洲精品一区av在线播放| 中文字幕精品www乱入免费视频| 日韩欧美成人网| 欧美激情一区二区久久久| 国产精品pans私拍| 黄色成人av在线| 亚洲自拍另类欧美丝袜| 亚洲xxx自由成熟| 中文字幕国产日韩| 日韩av第一页| 高清在线视频日韩欧美| 日韩精品中文在线观看| 91精品国产99久久久久久| 日韩av不卡电影| 亚洲美女av在线播放| 欧美日韩另类字幕中文| 亚洲成人av在线| 欧美一级片久久久久久久| 91久久中文字幕| 成人国产在线视频| 中文字幕国产日韩| 日韩在线视频线视频免费网站| 成人信息集中地欧美|