【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.
    //设置两个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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零基础直接上手java跨平台桌面程序,使用javafx(二)可视化开发Scene Builder

我们只做实用的东西&#xff0c;不学习任何理论&#xff0c;如果你想学习理论&#xff0c;请去买几大本书&#xff0c;慢慢学去。 NetBeans有可视化工具&#xff0c;但是IntelliJ IDEA对于javafx,默认是没有可视化工具的。习惯用vs的朋友觉得&#xff0c;写界面还要是有一个布局…

【双指针算法】原地处理数组的双指针算法思想

移动零 题目中已经明确表示不能重新创建数组来辅助解题&#xff0c;因此只能对数组进行原地操作&#xff0c;即双指针算法思想。 算法思想&#xff1a; 题目要求我们将非0元素放在数组的左边&#xff0c;0元素放在数组的右边&#xff0c;同时保持非0元素的相对位置。 这种对…

归并排序——逆序数对的统计

逆序数对的统计 题目描述 运行代码 #include <iostream> using namespace std; #define LL long long const int N 1e5 5; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) {if (l > r)return 0; int mid l r >> 1; LL res merge_sort(q, l,…

QT-轻量级的笔记软件MyNote

MyNote v2.0 一个轻量级的笔记软件&#x1f4d4; Github项目地址: https://github.com/chandlerye/MyNote/tree/main 应用简介 MyNote v2.0 是一款个人笔记管理软件&#xff0c;没有复杂的功能&#xff0c;旨在提供便捷的笔记记录、管理以及云同步功能。基于Qt 6.6.3 个人开…

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架&#xff0c;因此C的语法和数据类型在Qt中都是被支持的&#xff0c;但是Qt中也是定义了一些属于自己的数据类型&#xff0c;不过&#xff0c;好多数据类型都是对C的数据类型进行封装&#xff0c;下面来简要介绍一下这些基…

kafka集成SpringBoot api编写教程

1.新建项目 用的idea是20222.1.3版本&#xff0c;没有Spring Initializr 插件&#xff0c;不能直接创建springboot项目 可以在以下网址创建项目&#xff0c;下载后解压&#xff0c;然后用idea打开项目即可 1.1 在 https://start.spring.io/ 上创建项目 1.2上传到linux&#x…

第十四周 6.4 内部类部分知识点

一、理解 1.定义在一个类内部的类称为内部类 2.语法: class 类名{ class 类名{} } 3.内部类编译之后生成独立的.class文件&#xff0c;文件命名为:外部类类名$内部类的类名.class 4.内部类分类:成员内部类、静…

Layui弹框中设置输入框自动获取焦点无效/Layui设置Input框自动获取焦点无效,怎么办?

1、问题概述? 有时候为了用户体验,期望当弹框打开的时候,指定的输入框能自动的获取焦点,用户就可以直接输入了。提升了用户体验。但有时候设置的时候没有效果。 2、正常的设置自动获取焦点方式 【input框设置方式】 使用关键字autofocus <input type="text&quo…

OPenCV的重要结构体Mat

一 Mat Mat是什么&#xff1f; Mat有什么好处&#xff1f; class CV_EXPORTS Mat{ public: ... int dims;//维数 int rows,cols;//行列数 uchar *data;//存储数据的指针 int *refcount;//引用计数 ...};二 Mat属性 三 Mat拷贝 1 Mat浅拷贝 Mat A Aimread(file,IMREAD_COLOR) …

Java入门教程上

常见的cmd命令 类 class 字面量 数据类型 输入 public static void main(String[] args) {Scanner anew Scanner(System.in);int na.nextInt();int ma.nextInt();System.out.println(mn);} } 算数运算符 package wclg;public class test {public static void main(String[] ar…

网络安全难学吗?2024该怎么系统学习网络安全?

学习网络安全需要循序渐进&#xff0c;由浅入深。很多人对网络安全进行了解以后&#xff0c;就打算开始学习网络安全&#xff0c;但是又不知道怎么去系统的学习。 网络安全本身的知识不难&#xff0c;但需要学习的内容有很多&#xff0c;其中包括Linux、数据库、渗透测试、等保…

【算法专题--链表】环形链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、什么是环形链表&#xff1f; &#x1f95d; 环形链表的概念详解 &#x1f347; 环形链表的特点 &#x1f34d;环形链表的延申问题 三、高频面试题 ✨环形链表 ✨环形链表II ✨环形链表的环长 四、总结 五、共勉 一、前言 环形链表&#xff0c;可以说是…

单臂路由的配置(思科、华为)

#交换设备 不同vlan属于不同广播域&#xff0c;不能互相通信&#xff0c;他们配置的是不同网段的IP地址&#xff0c;针对不同网段的IP地址进行通信&#xff0c;就需要用到路由技术 实现不同vlan之间的通信技术有两种 单臂路由三层交换 单臂路由 一、思科设备的单臂路由配…

Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation

Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation 引言 本文前作 VDM 已经推导出了扩散模型可以将优化 ELBO 作为目标函数。然而现在 FID &#xff08;也就是感知质量&#xff09;最好的模型还是用的其他目标函数&#xff08;如 DDPM 的噪声预…

矩阵LU分解的应用

矩阵LU分解在机器学习和深度学习中的应用广泛&#xff0c;主要用于解决以下问题&#xff1a; 线性方程组求解&#xff1a;LU分解可以有效地解决线性方程组&#xff0c;这在训练模型时非常有用。矩阵求逆&#xff1a;在一些机器学习算法中&#xff0c;需要进行矩阵求逆操作&…

二维鱼游CFD代码

最近学了会Julia&#xff0c;参考了原作者的shark&#xff0c;做一下基于airfoils 2D的鱼游&#xff0c;暂时没想好有什么需要深入研究的&#xff0c;代码公开如下&#xff1a; 鱼身是naca0016&#xff0c;然后一些参数可以参考我以前发的论文。 using WaterLily, StaticArra…

46.django - 多语言配置

1.Django 多语言基础知识 多语言站点可以让不同语言的用户更好地使用和理解网站内容&#xff0c;提升用户体验和覆盖范围。为了实现多语言功能&#xff0c;我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分&#xff0c;感兴趣的可以看看。直接跳过…

k8s面试题大全,保姆级的攻略哦(三)

目录 1、简述ETCD及其特点? 2、简述ETCD适应的场景? 3、简述什么是Kubernetes? 4、简述Kubernetes和Docker的关系? 5、简述Kubernetes中什么是Minikube、Kubectl、Kubelet? 6、简述Kubernetes常见的部署方式? 7、简述Kubernetes如何实现集群管理? 8、简述Kubern…

双指针数组问题

删除有序数组中的重复项 重点在于p1 class Solution {public int removeDuplicates(int[] nums) {if(nums.length0) return 0;int p10,p21;while(p2<nums.length){if(nums[p2]!nums[p1]){nums[p1]nums[p2];}else p2;}return p11;} } class Solution {public void moveZeroe…

tkinter+火山引擎+python实现语音识别聊天机器人

想要做一款能通过语音识别来聊天的智能机器人,首先需要能通过麦克风录制语音进行识别转换成文字,将文字发送给机器人得到聊天结果,并能将返回的文字转换成语音进行合成,之后再通过本地播放语音实现语音交互。 架构: 实现步骤 一、本地录音 本地录音可以通过pyAudio库实…