UIKit之圖片瀏覽器

功能需求

實現一個圖片瀏覽器,點擊左右按鈕可以切換背景圖,且更新背景圖對應的索引頁和圖片描述內容。

分析:

  • 實現一個UIView的子類即可,該子類包含多個按鈕。

實現步驟:

  1. 使用OC語言,故創建cocoa Touch類型文件。Xcode會創建.h文件和.m文件:PicBrowserDemo類。
    在這里插入圖片描述

  2. 圖片資源導入:注意圖片不要重名
    注意各項的類型:Root是Array,其余是Dictionary

  3. 實現該類。
    該類帶有多個控件,令其繼承UIView。
    a. 聲明類的成員變量:在.h文件中定義:,類型是strong。
    該圖片瀏覽器需要兩個可顯示文字內容但不可修改的Label、兩個前后圖片切換的按鈕以及承載圖片的視圖。
    在.h 文件中:

@interface PicBrowserDemo : UIView
@property(strong, nonatomic) UIImageView  *imageView;
@property(strong, nonatomic) UILabel *label1;
@property(strong, nonatomic) UILabel *label2;
@property(strong, nonatomic) UIButton *btn1;
@property(strong, nonatomic) UIButton *btn2;
@end

b. 創建plist類型文件,直接在項目下創建,plist文件屬于resource類型文件,在該欄目下可找到。
選擇root類型為Array,而每個元素設置為字典,因為每個字典中存圖片的名稱和title(描述)。

c. .m 文件:

// 1 plist:信息填寫
// 2 初始化各個組件,顯示的信息以第一張為基準
// 3 nxt
// 4 pre
// 5 降低冗余,合并:pre、nxt函數#import "PicBrowserDemo.h"// 寫私有屬性:在這里
@interface PicBrowserDemo()
// assign、strong的區別: asign表示基本類型的變量
@property(nonatomic, strong) NSArray *pic;
@property(nonatomic, assign) int index;@end// 從plist中讀取到的各圖片信息集合@implementation PicBrowserDemo
-(instancetype) initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if(self){// 初始化5個組件_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 230, 150, 150)];// 圖片模式:放入如何顯示的 按比例縮放,不會拉伸變形_imageView.contentMode = UIViewContentModeScaleAspectFit;// 初始化為pic中第一張圖片NSDictionary *dict = self.pic[0];_imageView.image = [UIImage imageNamed:dict[@"icon"]];// 固定值寫法://_imageView.image = [UIImage imageNamed:@"i1.png"];// label1:_label1 = [[UILabel alloc] initWithFrame:CGRectMake(80, 190, 150, 40)];_label2 = [[UILabel alloc] initWithFrame:CGRectMake(80, 380, 150, 40)];// text填內容_label1.text = [NSString stringWithFormat:@"%d/%ld", 1, self.pic.count];// 下面的label填入title_label2.text = dict[@"title"];// 填充方式fill_label1.textAlignment = NSTextAlignmentCenter;_label2.textAlignment = NSTextAlignmentCenter;// btn1_btn1 = [[UIButton alloc] initWithFrame:CGRectMake(30, 300, 50, 50)];_btn2 = [[UIButton alloc] initWithFrame:CGRectMake(230, 300, 50, 50)];// btn1[_btn1 setBackgroundImage:[UIImage imageNamed:@"zuo1.jpg"] forState:UIControlStateNormal];// btn2[_btn2 setBackgroundImage:[UIImage imageNamed:@"you1.png"] forState:UIControlStateNormal];// 綁定點擊向前和向后[_btn1 addTarget:self action:@selector(changePages:) forControlEvents:UIControlEventTouchUpInside];//[_btn2 addTarget:self action:@selector(changePages:) forControlEvents:UIControlEventTouchUpInside];//        [_btn1 addTarget:self action:@selector(pre) forControlEvents:UIControlEventTouchUpInside];
//        //
//        [_btn2 addTarget:self action:@selector(nxt) forControlEvents:UIControlEventTouchUpInside];
//        // 用tags區分該切換前一張還是后一張_btn1.tag = 1;_btn2.tag = 2;[self addSubview: _imageView];[self addSubview: _btn1];[self addSubview: _btn2];[self addSubview: _label1];[self addSubview: _label2];}return self;
}// 重寫屬性pic的get方法懶加載:
/* 第一次調用一定為空,加載即可*/
- (NSArray *) pic{if(_pic == nil){// 獲取plist的文件路徑// nsBundle:獲取手機上軟件的安裝路徑,而非項目路徑NSString *path = [[NSBundle mainBundle] pathForResource:@"pics" ofType:@"plist"];// 讀取文件NSArray *array = [NSArray arrayWithContentsOfFile:path];NSLog(@"count:%ld", array.count);_pic = array;}return _pic;
}// 不需要參數:
- (void) changePages:(UIButton *)sender{switch (sender.tag) {case 1:_index--;break;case 2:_index++;break;}NSDictionary *dict = self.pic[self.index];// 上面的label填入頁碼_label1.text = [NSString stringWithFormat:@"%d/%ld", self.index+1, self.pic.count];// 下面的label填入title_label2.text = dict[@"title"];// 圖片框填入圖片:_imageView.image = [UIImage imageNamed:dict[@"icon"]];// 如果已經到了最后一張,則按鈕切換為不允許點// 索引為末尾-1,則設置下一張按鈕為不可點擊// 沒必要通過圖片來設置,通過yes、no設置即可達到所需的灰色狀態// 兩條必須同時設置:否則會出現 翻到底再返回時,向右按鈕仍然灰色self.btn2.enabled = !(_pic.count -1 == _index);self.btn1.enabled = !(0 == _index);
}// 加索引:
- (void) nxt{_index++;NSDictionary *dict = self.pic[self.index];// 上面的label:填入序號_label1.text = [NSString stringWithFormat:@"%d/%ld", self.index+1, self.pic.count];// 下面的label:填入標題_label2.text = dict[@"title"];// 圖片框填入圖片:_imageView.image = [UIImage imageNamed:dict[@"icon"]];// 如果已經到了最后一張,則按鈕切換為不允許點// 索引為末尾-1,則設置下一張按鈕為不可點擊// 沒必要通過圖片來設置,通過yes、no設置即可達到所需的灰色狀態self.btn2.enabled = !(_pic.count -1 == _index);self.btn1.enabled = !(0 == _index);
}//
- (void) pre{_index--;NSDictionary *dict = self.pic[self.index];// 上面的label:填入序號_label1.text = [NSString stringWithFormat:@"%d/%ld", self.index+1, self.pic.count];// 下面的label:填入標題_label2.text = dict[@"title"];// 圖片框填入圖片:_imageView.image = [UIImage imageNamed:dict[@"icon"]];// 如果為0,則設置向左不可點擊且更換圖片self.btn1.enabled = !(0 == _index);self.btn2.enabled = !(_pic.count -1 == _index);
}
@end

調用入口:

- (void)viewDidLoad {[super viewDidLoad];//[self test_Common_arrtibute];[self testPicBrowser];
}-(void) testPicBrowser{PicBrowserDemo *browserView = [[PicBrowserDemo alloc] initWithFrame:CGRectMake(50, 80, 300 ,700)];//[browserView setBackgroundColor: [UIColor blueColor]];[self.view addSubview:browserView];}
  1. 效果展示
  1. 首頁只可向右
  2. 尾頁只可向左

在這里插入圖片描述
在這里插入圖片描述

要注意的問題以及犯錯

  1. 關于懶加載:
    設置變量同名的函數,實則為setter,判斷變量指向為空,則做初始化獲取操作,后續再利用都不需要,此為懶加載方式。
  1. 關于plist加載:
    使用bundle接口,, 通過plist文件名即可,該底層原理是使用了安裝APP后的文件結構來獲取文件,而非運行工程的目錄結構。
  1. plist總是讀取為空
    我的plist獲取方式是讀取Array接口,而我的plist中root設置為dictionary類型,因此接口不對應,獲取錯誤了。改root為array類型即可。
  1. 初始化index報錯
    switch中,tag為2是向右點擊,所以應該index++。
  1. 圖片瀏覽器初始化:
    按pic第一張的圖片和title初始化即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13088.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫的存儲過程、函數與觸發器

使用下面的場景來引入 1.創建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

開源連鎖收銀系統哪個好

針對開源連鎖收銀系統的選擇,商淘云是一個備受關注的候選。商淘云以其功能豐富、易于定制和穩定性等優勢,吸引了眾多企業和開發者的關注。下面將從四個方面探討商淘云開源連鎖收銀系統的優勢: 首先,商淘云提供了豐富的功能模塊。作…

如何查看SNMP設備的OID

什么是OID和MIB OID OID 代表對象標識符。 OID 唯一地標識 MIB 層次結構中的托管對象。 這可以被描述為一棵樹,其級別由不同的組織分配。MIB MIB(管理信息基)提供數字化OID到可讀文本的映射。 使用MIB Browser掃描OID 我的設備是一臺UPS SN…

【Uniapp小程序】onShareAppMessage異步處理請求完后再分享

分享按鈕 <button type"primary" open-type"share">保存并分享 </button>修改onShareAppMessage saveImage為promise方法 async onShareAppMessage() {const saveRes await saveImage();if (saveRes.code 200) {return {title: "tit…

每日兩題 / 236. 二叉樹的最近公共祖先 124. 二叉樹中的最大路徑和(LeetCode熱題100)

236. 二叉樹的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; dfs統計根節點到p&#xff0c;q節點的路徑&#xff0c;兩條路徑中最后一個相同節點就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

windows部署騰訊tmagic-editor02-Runtime

創建editor項目 將上一教程中的hello-world復制過來&#xff0c;改名hello-editor 創建runtime項目 和hello-editor同級 pnpm create vite刪除src/components/HelloWorld.vue 按鈕需要用的ts types依賴 pnpm add tmagic/schema tmagic/stage實現runtime 將hello-editor中…

【C語言】5.C語言函數(2)

文章目錄 7.嵌套調?和鏈式訪問7.1 嵌套調?7.2 鏈式訪問 8.函數的聲明和定義8.1 單個?件8.2 多個?件8.3 static 和 extern8.3.1 static 修飾局部變量8.3.2 static 修飾全局變量8.3.3 static 修飾函數 7.嵌套調?和鏈式訪問 7.1 嵌套調? 嵌套調用就是函數之間的互相調用。…

Docker安裝Mosquitto

在物聯網項目中&#xff0c;我們經常用到MQTT協議&#xff0c;用MQTT協議做交互就需要部署一個MQTT服務&#xff0c;而mosquitto是一個常用的MQTT應用服務&#xff0c; Mosquitto是一個實現了消息推送協議MQTT v3.1的開源消息代理軟件。MQTT&#xff08;Message Queuing Teleme…

python的幾個關于文本文件的demo腳本

部分來自WeTab AI PRO 1.在文末添加一行文字 def add_endline(filename, texts): # 文本末尾增加一行with open(filename, a) as file:file.write(f\n{texts})file.close() 當使用 open() 函數打開文件時&#xff0c;第二個參數指定了文件的打開模式。常見的文件打開模式包…

【LeetCode】每日一題 2024_5_14 完成所有任務需要的最少輪數(哈希)

文章目錄 LeetCode&#xff1f;啟動&#xff01;&#xff01;&#xff01;題目&#xff1a;完成所有任務需要的最少輪數題目描述代碼與解題思路 每天進步一點點 LeetCode&#xff1f;啟動&#xff01;&#xff01;&#xff01; 題目&#xff1a;完成所有任務需要的最少輪數 題…

拿到測試點如何跑

首先你要知道你測試點文件的位置,然后你要創建一個接收結果的文件,將你代碼中的std::cin替換成infile,std::cout替換成outfile即可 #include <fstream> int main() {// 打開輸入文件std::ifstream infile("C:\\Users\\Downloads\\P4779_1.in");// 打開輸出文件…

OpenCV 圖像退化與增強

退化 濾波 img_averagingcv2.blur(img2,(3,3)) #均值濾波 img_median cv2.medianBlur(img2,3) #中值濾波高斯模糊 result cv2.GaussianBlur(source, (11,11), 0)高斯噪聲 def add_noise_Guass(img, mean0, var0.01): # 添加高斯噪聲img np.array(img / 255, dtypefloat…

麒麟 V10 安裝docker2

1. 查看系統版本 2.安裝docker-ce 添加源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安裝docker yum install docker-ce --allowerasing 重啟docker systemctl start docker 3.安裝nvidia-container-runtime 添…

el-tooltip 提示框樣式修改?

【element-plus el-tooltip官網地址&#xff1a; Tooltip 文字提示 | Element Plus】 <el-tooltippopper-class"Tooltip":content"content"placement"top"effect"light" ><span class"content">{{ content }}&l…

【TypeScript的JSX簡介以及使用方法】

TypeScript 是 JavaScript 的一個超集&#xff0c;它添加了靜態類型檢查和面向對象編程的特性。JSX 是一種 JavaScript 的語法擴展&#xff0c;主要用于 React 組件的聲明性渲染。TypeScript 完美地支持 JSX&#xff0c;并允許你為 React 組件和它們的 props 添加類型注解。 T…

C中Mysql的基本api接口

一、初始化參數返回值 二、鏈接服務器三、執行SQL語句注意事項 四、獲取結果集4.1mysql_affected_rows和mysql_num_rows4.2mysql_store_result與mysql_free_result注意事項注意事項整體的工作流程 4.3mysql_use_result&#xff08;&#xff09;4.4mysql_field_count&#xff08…

001 側邊欄 地址增刪改查 默認地址代碼沒完善

文章目錄 user_index.htmlmyaccount_style.cssmyaccount_scripts.jsaddress_edit.htmlReceiverAddressReceiverAddressControllerReceiverAddressServiceImplIReceiverAddressServiceRFshopAppApplicationServletInitializerpom.xmlReceiverAddressMapper.xmlReceiverAddressMa…

文件存儲解決方案-阿里云OSS

文章目錄 1.菜單分級顯示問題1.問題引出1.蘋果燈&#xff0c;放到節能燈下面也就是id大于1272.查看菜單&#xff0c;并沒有出現蘋果燈3.放到燈具下面id42&#xff0c;就可以顯示 2.問題分析和解決1.判斷可能出現問題的位置2.找到遞歸返回樹形菜單數據的位置3.這里出現問題的原因…

Golang 的 unmarshal 踩坑指南

文章目錄 1. 寫在最前面2. 字段區分出空字段還是未設置字段2.1 問題描述2.2 解決 3. 字段支持多種類型 & 按需做不同類型處理3.1 問題描述3.2 解決 4. 碎碎念5. 參考資料 1. 寫在最前面 筆者最近在實現將內部通知系統的數據定義轉化為產品定義的對外提供的數據結構。 舉例…

算法學習筆記(5.0)-基于比較的高效排序算法-歸并排序

##時間復雜度O(nlogn) 目錄 ##時間復雜度O(nlogn) ##遞歸實現歸并排序 ##原理 ##圖例 ##代碼實現 ##非遞歸實現歸并排序 ##釋 #代碼實現 ##遞歸實現歸并排序 ##原理 是一種基于分治策略的基礎排序算法。 1.劃分階段&#xff1a;通過不斷遞歸地將數組從中點處分開&…