【iOS】UI学习——登陆界面案例、照片墙案例

文章目录

  • 登陆界面案例
  • 照片墙案例

登陆界面案例

这里通过一个登陆界面来复习一下前面学习的内容。

先在接口部分定义两个UILabel、两个UITextField、两个UIButton按键

#import <UIKit/UIKit.h>@interface ViewController : UIViewController
{UILabel* _lbUser;UILabel* _lbPassword;UITextField* _textUser;UITextField* _textPassword;UIButton* _btn1;UIButton* _btn2;
}
@property (retain, nonatomic) UILabel* lbUser;
@property (retain, nonatomic) UILabel* lbPassword;
@property (retain, nonatomic) UITextField* textUser;
@property (retain, nonatomic) UITextField* textPassword;
@property (retain, nonatomic) UIButton* btn1;
@property (retain, nonatomic) UIButton* btn2;@end

实现部分

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController
@synthesize lbUser = _lbUser;
@synthesize lbPassword = _lbPassword;
@synthesize textUser = _textUser;
@synthesize textPassword = _textPassword;
@synthesize btn1 = _btn1;
@synthesize btn2 = _btn2;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//设置两个UILabelself.lbUser = [[UILabel alloc] initWithFrame:CGRectMake(50, 160, 100, 40)];self.lbUser.text = @"用户名:";self.lbUser.font = [UIFont systemFontOfSize:24];self.lbPassword = [[UILabel alloc] initWithFrame:CGRectMake(50, 230, 100, 40)];self.lbPassword.text = @"密码:";self.lbPassword.font = [UIFont systemFontOfSize:24];[self.view addSubview:self.lbUser];[self.view addSubview:self.lbPassword];//设置两个输入框self.textUser = [[UITextField alloc] initWithFrame:CGRectMake(150, 160, 200, 40)];self.textUser.borderStyle = UITextBorderStyleRoundedRect;self.textUser.keyboardType = UIKeyboardTypeDefault;self.textUser.font = [UIFont systemFontOfSize:24];self.textUser.text = @"";[self.view addSubview:self.textUser];_textPassword = [[UITextField alloc] initWithFrame:CGRectMake(150, 230, 200, 40)];self.textPassword.borderStyle = UITextBorderStyleRoundedRect;self.textPassword.keyboardType = UIKeyboardTypeDefault;self.textPassword.font = [UIFont systemFontOfSize:24];self.textPassword.text = @"";[self.view addSubview:self.textPassword];//设置两个按钮self.btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];self.btn1.frame = CGRectMake(150, 350, 100, 40);[self.btn1 setTitle:@"登陆" forState:UIControlStateNormal];self.btn1.titleLabel.font = [UIFont systemFontOfSize:32];[self.btn1 addTarget:self action:@selector(pressLogin) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:self.btn1];self.btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];self.btn2.frame = CGRectMake(150, 450, 100, 40);[self.btn2 setTitle:@"注册" forState:UIControlStateNormal];self.btn2.titleLabel.font = [UIFont systemFontOfSize:32];[self.btn2 addTarget:self action:@selector(pressRegister) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:self.btn2];
}-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {[self.textUser resignFirstResponder];[self.textPassword resignFirstResponder];
}-(void) pressLogin
{NSString* Username = @"Reus";NSString* Password = @"123098";NSString* strUser = self.textUser.text;NSString* strPass = self.textPassword.text;if([Username isEqual:strUser] && [Password isEqual:strPass]) {NSLog(@"对对对");UIAlertController* ele = [UIAlertController alertControllerWithTitle:@"提示" message:@"您的账号和密码输入正确,即将进入主页面" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction* act = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){//设置密码输入正确将要进入的界面UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10000, 10000)];view.backgroundColor = [UIColor grayColor];UILabel* lb = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 300, 100)];lb.text = @"哈哈哈哈哈哈哈哈";lb.textColor = [UIColor redColor];lb.font = [UIFont systemFontOfSize:34];[view addSubview:lb];[self.view addSubview:view];}];[ele addAction:act];[self presentViewController:ele animated:YES completion:nil];} else {UIAlertController* ele = [UIAlertController alertControllerWithTitle:@"提示" message:@"您的账号或密码输入错误,请重新输入" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction* act = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action){self.textUser.text = @"";self.textPassword.text = @"";}];[ele addAction:act];[self presentViewController:ele animated:YES completion:nil];}
}-(void) pressRegister
{NSLog(@"好好好");
}@end

效果图
在这里插入图片描述

照片墙案例

UITapGestureRecognizer:iOS 中一种手势识别器,用于检测用户在屏幕上的单击或双击操作。

在 Objective-C 中,- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 是 UINavigationController 类的一个实例方法,用于将一个新的视图控制器添加到导航栈中,并将其推送到当前视图控制器上。

该方法的主要作用如下:

添加新的视图控制器到导航栈中
该方法会将传入的 viewController 参数添加到导航栈的顶部,成为当前显示的视图控制器。
切换到新的视图控制器
调用该方法后,导航控制器会切换到新推送的视图控制器,用户将看到新的视图控制器的内容。
动画效果
animated 参数决定了视图切换时是否使用动画效果。如果设置为 YES,则视图切换时会有一个平滑的动画效果;如果设置为 NO,则视图会立即切换到新的视图控制器。
导航栈管理
每次调用该方法后,新的视图控制器都会被添加到导航栈的顶部。用户可以通过导航栏上的返回按钮,返回到之前的视图控制器。

SceneDelegate.m:

#import "SceneDelegate.h"
#import "VCRoot.h"
@interface SceneDelegate ()@end@implementation SceneDelegate- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {//导航控制器框架结构UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:[[VCRoot alloc] init]];self.window.rootViewController = nav;[self.window makeKeyAndVisible];
}- (void)sceneDidDisconnect:(UIScene *)scene {// Called as the scene is being released by the system.// This occurs shortly after the scene enters the background, or when its session is discarded.// Release any resources associated with this scene that can be re-created the next time the scene connects.// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}- (void)sceneDidBecomeActive:(UIScene *)scene {// Called when the scene has moved from an inactive state to an active state.// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}- (void)sceneWillResignActive:(UIScene *)scene {// Called when the scene will move from an active state to an inactive state.// This may occur due to temporary interruptions (ex. an incoming phone call).
}- (void)sceneWillEnterForeground:(UIScene *)scene {// Called as the scene transitions from the background to the foreground.// Use this method to undo the changes made on entering the background.
}- (void)sceneDidEnterBackground:(UIScene *)scene {// Called as the scene transitions from the foreground to the background.// Use this method to save data, release shared resources, and store enough scene-specific state information// to restore the scene back to its current state.
}@end

VCRoot.m:

#import "VCRoot.h"
#import "VCImageShow.h"
@interface VCRoot ()@end@implementation VCRoot- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.title = @"照片墙";self.navigationController.navigationBar.translucent = YES;self.view.backgroundColor = [UIColor whiteColor];UIScrollView* sv = [[UIScrollView alloc] init];sv.frame = self.view.bounds;//CGRectMake(5, 10, 394, 852);sv.contentSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);//  打开交互事件,关闭会导致无法使用点击等手势操作成功运行sv.userInteractionEnabled = YES;for(int i = 0; i < 10; i++) {NSString* strName = [NSString stringWithFormat:@"%d.JPG",i+1];UIImage* image = [UIImage imageNamed:strName];UIImageView* iview = [[UIImageView alloc] initWithImage:image];iview.frame = CGRectMake(10 + (i % 3) * self.view.bounds.size.width / 3, (i / 3) * self.view.bounds.size.height / 4, 110, 200);[sv addSubview:iview];iview.userInteractionEnabled = YES;iview.tag = 101 + i;UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(press:)];//表示我们需要检测单次点击事件tap.numberOfTapsRequired = 2;//表示我们需要检测单指点击事件tap.numberOfTouchesRequired = 1;//将手势识别器添加到视图上去[iview addGestureRecognizer:tap];}[self.view addSubview:sv];
}-(void) press:(UITapGestureRecognizer*) tap {UIImageView* imageView = (UIImageView*) tap.view;//创建显示视图控制器VCImageShow* imageShow = [[VCImageShow alloc] init];imageShow.imageTag = imageView.tag;[self.navigationController pushViewController:imageShow animated:YES];
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

VCIamgeShow.h:

#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN@interface VCImageShow : UIViewController
@property (assign, nonatomic) NSUInteger imageTag;
@property (nonatomic, retain) UIImage* image;
@property (nonatomic, retain) UIImageView* imageView;
@end

VCImageShow.m:

#import "VCImageShow.h"
#import "VCRoot.h"
@interface VCImageShow ()@end@implementation VCImageShow
@synthesize imageView = _imageView;
@synthesize image = _image;
- (void)viewDidLoad {[super viewDidLoad];self.title = @"图片展示";UIImageView* _imageView = [[UIImageView alloc] init];_imageView.frame = self.view.bounds;_imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%lu.JPG", (unsigned long)(_imageTag-100)]];[self.view addSubview:_imageView];
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

效果图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/345579.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于AT89C51单片机的红外防盗报警器设计

第一章 绪论1.1 选题背景 随着社会科学的不断进步和发展,人们生活水平得到很大的提高,对个人私有财产的保护越来越重视,因而对于防盗的措施提出了更高的要求。本设计就是为了满足现代生活防盗的需要而设计的应用于家庭、车库、仓库和保险柜等处进行防盗监控的无线防盗报警装…

【RAG入门教程03】Langchian框架-文档加载

Langchain 使用文档加载器从各种来源获取信息并准备处理。这些加载器充当数据连接器&#xff0c;获取信息并将其转换为 Langchain 可以理解的格式。 LangChain 中有几十个文档加载器&#xff0c;可以在这查看https://python.langchain.com/v0.2/docs/integrations/document_lo…

Hive日志介绍

日志描述 日志路径&#xff1a;Hive相关日志的默认存储路径为“/var/log/Bigdata/hive/角色名”&#xff0c;Hive1相关日志的默认存储路径为“/var/log/Bigdata/hive1/角色名”&#xff0c;以此类推。 HiveServer&#xff1a;“/var/log/Bigdata/hive/hiveserver”&#xff0…

【算法】常用排序算法(插入排序、希尔排序、堆排序、选择排序、冒泡排序、快速排序、归并排序、计数排序)超详细

排序算法是数据结构相关知识中非常重要的一节&#xff0c;相信很多小伙伴对这部分知识一知半解。那么接下来&#xff0c;小编就要带领大家一起来进行对排序算法的深入剖析学习&#xff0c;希望本篇文章能够使你有所收获&#xff01; 一.常见的排序算法 排序算法有很多种&#…

‘AndroidStudio工具平台’尝试运行‘Android原生项目’

AndroidStudio工具平台 (内嵌Intelli IDEA集成环境) /Users/haijunyan/Library/Android/sdk 配置环境变量: #adb命令&#xff0c;安装APK查看连接设备 platform-tools #emulator命令&#xff0c;通过命令创建模拟器 tools #用NDK框架搭建的项目&#xff0c;用到下面的命令编译 …

【Oracle】Oracle导入导出dmp文件

文章目录 前言一、什么是dmp&#xff1f;二、imp/impdp、exp/expdp对比及示例1.区别2.imp/impdp对比及示例a. impb. impbp 3.exp/expdp对比及示例a. expb.expdp 3.其他事项 三、执行导入导出前置条件1.创建角色并授权2.创建目录映射 前言 在工作中&#xff0c;经常会遇到需要备…

Serif Affinity 2.5 (macOS, Windows) - 专业创意软件

Serif Affinity 2.5 (macOS, Windows) - 专业创意软件 Affinity Designer 2, Affinity Photo 2, Affinity Publisher 2 请访问原文链接&#xff1a;Serif Affinity 2.5 (macOS, Windows) - 专业创意软件&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主…

【数据结构(邓俊辉)学习笔记】图06——最小支撑树

文章目录 0. 概述1. 支撑树2. 最小支撑树3. 歧义性4. 蛮力算法5. Prim算法5.1 割与极短跨越边5.2 贪心迭代5.3 实例5.4 实现5.5 复杂度 0. 概述 学习下最小支撑树和prim算法。 1. 支撑树 最小的连通图是树。 连通图G的某一无环连通子图T若覆盖G中所有的顶点&#xff0c;则称…

【算法小记】深度学习——时间序列数据分析 Time series Data Analysis

在本篇博客中将简单介绍常见的几种循环神经网络和一维卷积神经网络&#xff0c;并使用一些简答的数据进行拟合分析。本文相对适合刚入门的同学&#xff0c;同时也作为自己过去一段时间学习的总结和记录&#xff0c;现在神经网络框架已经非常完善的支持了很多常见和有效的深度学…

Channels无法使用ASGI问题

Django Channels是一个基于Django的扩展, 用于处理WebSockets, 长轮询和触发器事件等实时应用程序. 它允许Django处理异步请求, 并提供了与其他WebSockets库集成的功能.当我们在Django Channels中使用ASGI_APPLICATION设置时, 我们可以指定一个新的ASGI应用程序来处理ASGI请求.…

Linux基础I/O

一&#xff0c;系统文件I/O 写文件: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main() {umask(0);int fd open("myfile", O_WRO…

Docker高级篇之Docker微服务实战

文章目录 1. 构建一个简单的微服务项目2. 编写Dockerfile发布微服务部署到docker容器 1. 构建一个简单的微服务项目 创建一个SpringBoot项目 创建一个Controller RestController public class OrderController {Value("${server.port")private String port;Reques…

C语言:双链表

一、什么是双链表&#xff1f; 双链表&#xff0c;顾名思义&#xff0c;是一种每个节点都包含两个链接的链表&#xff1a;一个指向下一个节点&#xff0c;另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比&#xff0c;双链表不仅可以…

Rust 实战丨SSE(Server-Sent Events)

&#x1f4cc; SSE&#xff08;Server-Sent Events&#xff09;是一种允许服务器向客户端浏览器推送信息的技术。它是 HTML5 的一部分&#xff0c;专门用于建立一个单向的从服务器到客户端的通信连接。SSE的使用场景非常广泛&#xff0c;包括实时消息推送、实时通知更新等。 S…

C++中的priority_queue和deque以及适配器

C中的priority_queue和deque 一丶 priority_queue1.1 priority_queue的介绍1.2 priority_queue的使用1.3 priority_queue的模拟实现 二丶 deque2.1 deque的简单介绍2.2 deque的缺陷2.3 为什么要选择deque作为stack和queue的迭代器 三丶 容器适配器3.1 什么是适配器3.2 STL标准库…

Effective Java 2 遇到多个构造器参数时要考虑使用构建器

第2个经验法则&#xff1a;用遇到多个构造器参数时要考虑使用构建器&#xff08;consider a builder when faced with many constructor parameters&#xff09; 上一条讨论了静态工厂相对于构造器来说有五大优势。但静态工厂和构造器有个共同的局限性:它 们都不能很好地扩展到…

开源网关Apache APISIX启用JWT身份验证

说明&#xff1a; 本文APISIX的配置参考我之前写的《Ubuntu部署Apache APISIX》 创建最小API 首先&#xff0c;确保你已经安装了.NET 6 SDK。创建文件夹“MinimalApiDemo”&#xff0c;VS Code打开文件夹&#xff0c;打开终端 dotnet new web -o MinimalApiDemo cd Minimal…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】

文章目录 前言一、获取所有学院信息接口执行二、线程组的介绍 2.1 并发和顺序执行 2.2 优先和最后执行线程组 2.3 线程组的设置细节三、HTTP请求的介绍四、查看结果树的配置使用总结 前言 一、获取所有学院信息接口执行 我们先针对一条简单的接口进行执行&#…

代码随想录刷题笔记-哈希表篇

文章目录 242 有效的字母异位词(easy)力扣地址题目描述题目实例解题思路代码实现 383 赎金信(easy)力扣地址题目描述题目实例解题思路代码实现 49 字母异位词分组(mid)力扣地址题目描述题目实例解题思路代码实现 438 找到字符串中所有字母异位词(mid)力扣地址题目描述题目实例解…

3038. 相同分数的最大操作数目 I(Rust模拟击败100%Rust用户)

题目 给你一个整数数组 nums &#xff0c;如果 nums 至少 包含 2 个元素&#xff0c;你可以执行以下操作&#xff1a; 选择 nums 中的前两个元素并将它们删除。 一次操作的 分数 是被删除元素的和。 在确保 所有操作分数相同 的前提下&#xff0c;请你求出 最多 能进行多少次…