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

news2024/12/24 2:34:25

文章目录

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

登陆界面案例

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

先在接口部分定义两个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.
    //设置两个UILabel
    self.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.coloradmin.cn/o/1807387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

报错:CMake Error OpenCVConfig.cmake opencv-config.cmake

1、编译过程中&#xff0c;出现OpenCV 报错问题 报错&#xff1a;CMake Error OpenCVConfig.cmake opencv-config.cmake 解决思路&#xff1a;参考此链接

3.大模型高效微调PEFT

大模型高效微调(PEFT)技术 预训练模型的背景 预训练与微调:传统的微调方法通常涉及对整个预训练模型的参数进行再训练,以适应特定任务。这虽然有效,但计算成本高,且需要大量的标记数据。模型结构:像BERT或GPT这样的模型通常包含数亿甚至数十亿个参数,构成一个深层次的…

Discuz! X3.4发帖时间修改插件批量操作版

下载地址&#xff1a;Discuz! X3.4发帖时间修改插件批量操作版 发帖时间与回复时间说明 1、使用本插件修改发帖时间&#xff0c;则帖子中的回复楼层的时间会保持同步同间隔修改&#xff0c;所谓同步同间隔就是如果某个回复是在主题发布之后一小时回复的&#xff0c;那么修改之…

智慧园区建设方案(Word)

1. 楼栋管理 2. 物业管理 3. 安防管理 4. 门禁管理 5. 停车管理 6. 能源管理 7. 环保管理 8. 园区生活服务 9. 招商管理 10. 收费中心 11. 园区地图 12. 门户网站 软件整套原件获取&#xff1a;本文末个人名片。

Elasticsearch中各种query的适用场景

Elasticsearch 提供了丰富的 Query 类型&#xff0c;以满足各种搜索需求。以下列举一些常见的 Query 类型&#xff0c;并分析其区别和应用场景&#xff1a; 一、 几个常用的基本Query 1. Term Query 应用场景: 查找包含特定词语的文档&#xff0c;适合精确匹配单个词语的场景…

AI 大模型重点行业应用情况

1、AI 大模型重点行业应用情况总览 AI大模型将率先在互联网办公、金融等数字化程度较高的行业快速渗透&#xff0c;医疗、交通、 制造等行业的潜在渗透空间大。 2、AI 大模型在金融行业应用情况 金融行业的应用场景丰富&#xff0c;是最早进行数字化转型的机构&#xff0c;因此…

计算机网络 —— 网络层 (路由协议)

计算机网络 —— 网络层 &#xff08;路由协议&#xff09; 什么是路由协议内部网关协议RIP关键特性 OSPF主要特点 外部网关协议BGP关键特性 我们今天来看路由协议&#xff1a; 什么是路由协议 路由协议是网络设备&#xff08;主要是路由器&#xff09;用来决定数据包在网络中…

Channels无法使用ASGI问题

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

按键精灵安装有乱码并且不能启动的解决办法

在国外购了电脑&#xff0c;系统是英文版 Windows 11&#xff0c;按键精灵死活都装不上去&#xff0c;打开exe的安装文件后出现乱码&#xff0c;安装完了后还是乱码&#xff0c;并且启动不了&#xff0c;以下是解决办法&#xff1a; 进入控制面板&#xff0c;并且点 Region&am…

redis windos修复版本

遇到的问题: Django的channel插件连接安装在windows上的redis报错: unknown command BZPOPMIN, channels-redis版本和redis不兼容导致.解决方案: 更新Redis版本. 微软官方维护的 Redishttps://github.com/microsoftarchive/redis/releases 2016年后就不更新了, 版本停留在了3.x…

HikariCP连接池初识

HikariCP的简单介绍 hikari-光&#xff0c;hikariCP取义&#xff1a;像光一样轻和快的Connetion Pool。这个几乎只用java写的中间件连接池&#xff0c;极其轻量并注重性能&#xff0c;HikariCP目前已是SpringBoot默认的连接池&#xff0c;伴随着SpringBoot和微服务的普及&…

数据结构之线性表(1)

数据结构之线性表 1.线性表的定义 线性表是一种线性结构。在一个线性表中数据元素的类型是相同的&#xff0c;或者说线性表是由同一类型的数据元素构成的线性结构。 线性表是具有相同数据类型的n&#xff08;n>0&#xff09;个数据元素的有限序列。 n表示表长&#xff0c;…

java版多语言抢单系统 多语言海外AEON抢单可连单加额外单源码 抢单平台搭建开发 抢单开挂的软件

此套是全新开发的java版多语言抢单系统。 后端java&#xff0c;用的若依框架&#xff0c;这套代码前后端是编译后的&#xff0c;测试可以正常使用&#xff0c;语言繁体&#xff0c;英文&#xff0c;日语 源码大小&#xff1a;155M 源码下载&#xff1a;https://download.csd…

QT系列教程(10) QTextEdit学习

简介 QTextEdit是文本编辑器&#xff0c;支持富文本功能。接下来我们创建一个Qt Application 应用&#xff0c;然后在ui中添加一个QTextEdit插件。 运行程序后&#xff0c;可以在QTextEdit中输入任何文字也包括富文本。 文本块 我们在MainWindow的ui文件中添加了textedit插件…

iOS--block再学习

block再学习 什么是blockblock是带有自动变量的匿名函数block语法 block的实现block的实质截获自动变量__blcok说明符Block存储域__block变量存储域使用__block变量用结构体成员变量__forwarding的原因 截获对象 什么是block Block时c语言的扩充功能&#xff0c;它允许开发者定…

图像处理方向信息

前言 Exif 规范 定义了方向标签&#xff0c;用于指示相机相对于所捕获场景的方向。相机可以使用该标签通过方向传感器自动指示方向&#xff0c;也可以让用户通过菜单开关手动指示方向&#xff0c;而无需实际转换图像数据本身。 在图像处理过程中&#xff0c;若是原图文件包含…

中间件学习-RocketMQ-从零到一学习-2RocketMQ 的工作原理

中间件学习-RocketMQ-从零到一学习-2RocketMQ 的工作原理 RocketMQ 工作原理 1. 启动 NameServer 启动 NameServer。NameServer 启动后监听端口&#xff0c;等待 Broker、Producer、Consumer 连接&#xff0c;相当于一个路由控制中心。 2. 启动 Broker 启动 Broker。与所有…

ansible.cfg forks参数

在Ansible的配置文件ansible.cfg中&#xff0c;forks参数是一个非常关键的设置&#xff0c;它控制了Ansible执行任务时的并发连接数&#xff0c;直接影响到Ansible执行 playbook 或 ad-hoc 命令时的速度和效率。 意义与作用 并发控制&#xff1a;当你使用Ansible来管理多台主…

VRRP基础配置(华为)

#交换设备 VRRP基础配置 VRRP (Virtual Router Redundancy Protocol) 全称是虚拟路由规元余协议&#xff0c;它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;该虚拟路由器在本地局域网拥有唯一的一个虚拟 ID 和虚拟 IP 地址。实际上&…