UI编程-UIView及其⼦子类

8 篇文章 0 订阅
//
//  AppDelegate.m
//  UI01_UIView_UILabel
//
//  Created by dllo on 15/7/10.
//  Copyright (c) 2015年 dllo. All rights reserved.
//

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
#pragma mark - 知识点1 UIWindow
    
    /* 创建一个和屏幕一样大小的UIWindow对象 */
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    // Override point for customization after application launch.
    
    /* 将window属性的背景颜色设置为白色, 注意是UIColor对象 */
    self.window.backgroundColor = [UIColor whiteColor];
    
    /* 使window成为主window并可见 */
    [self.window makeKeyAndVisible];
    
#pragma mark - 知识点2 UIView
    
    /* 创建UIView对象 */
    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 120, 200, 200)];
    
    /* 获取屏幕的宽和高 */
    CGFloat f1 = [UIScreen mainScreen].bounds.size.width;
    CGFloat f2 = [UIScreen mainScreen].bounds.size.height;
    NSLog(@"width:%f", f1);
    NSLog(@"height:%f", f2);
    
    /* 设置view背景颜色 */
    view1.backgroundColor = [UIColor greenColor];
    view2.backgroundColor = [UIColor redColor];
    
    /* 将view1对象添加到window上 */
    [self.window addSubview:view1];/* view1的引用计数会 +1 */
    
    /* frame 属性, 它的参照坐标系是父视图
     * 将view2 添加在view1 上
     */
//    [view1 addSubview:view2];
    
    /* center 属性, 它的参照坐标系是父视图 */
//    view2.center = CGPointMake(20, 20);
    
    /* view的其他API */
    /* 透明度, 注意子视图也会更改 */
    view1.alpha = 0.7;
    
    /* view 的子视图 */
    NSArray *arr = view1.subviews;
    NSLog(@"%@", arr);
    NSLog(@"%@", self.window.subviews);
    
    /* 获取view 的父视图 */
    NSLog(@"%@", view2.superview);
    NSLog(@"%@", self.window.superview);
    
    /* 视图层级管理 */
    /* view1, view2 都是self.window子视图 */
    [self.window addSubview:view2];
    
    /* 把view1放在最前面 */
    [self.window bringSubviewToFront:view1];
    
    /* 创建一个新的视图view3, 放在view1 和 view2 之间 */
    UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(80, 80, 200, 200)];
    view3.backgroundColor = [UIColor orangeColor];
    [self.window insertSubview:view3 atIndex:1];
    
    /* 创建一个新的视图view4, 放在view1 和 view3之间 */
    UIView *view4 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    view4.backgroundColor = [UIColor grayColor];
    [self.window insertSubview:view4 aboveSubview:view3];
    
    /* 更改view1 和 view2 的位置 */
    [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:3];
    
    /* hidden 属性 */
    view4.hidden = YES;
    NSLog(@"%@", self.window.subviews);
    
    /* tag 属性 */
    view1.tag = 100;
    view2.tag = 200;
    view3.tag = 300;
    view4.tag = 400;
    NSLog(@"%@", self.window.subviews);
    
    /* 根据tag 获取view对象 */
    UIView *findView = [self.window viewWithTag:100];

    /* 注意:内存问题 */
    [view1 release];
    [view2 release];
    [view3 release];
    [view4 release];
    [_window release];
    

    return YES;
}

/* MRC 下, 属性的引用计数问题, 需要重写dealloc方法 */
- (void)dealloc
{
    [_window release];
    [super dealloc];
    
}
@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是手势解锁的Demo实现过程: 1. 首先创建一个UIView子类,作为手势解锁的主体视图,我们称之为`GestureLockView`。 2. 在`GestureLockView`中创建一个数组`circleArray`,用于存储手势解锁的圆点。 ``` @property (nonatomic, strong) NSMutableArray *circleArray; ``` 3. 在`GestureLockView`的`layoutSubviews`方法中,创建9个圆点,并加入到`circleArray`中。 ``` - (void)layoutSubviews { [super layoutSubviews]; CGFloat margin = (self.frame.size.width - 3 * kCircleSize) / 4.0; for (int i = 0; i < 9; i++) { CGFloat x = margin + (i % 3) * (margin + kCircleSize); CGFloat y = margin + (i / 3) * (margin + kCircleSize); CGRect frame = CGRectMake(x, y, kCircleSize, kCircleSize); GestureLockCircle *circle = [[GestureLockCircle alloc] initWithFrame:frame]; circle.tag = i + 1; [self addSubview:circle]; [self.circleArray addObject:circle]; } } ``` 4. 在`GestureLockView`中创建一个数组`selectedArray`,用于存储用户选择的圆点。 ``` @property (nonatomic, strong) NSMutableArray *selectedArray; ``` 5. 在`GestureLockView`中实现手势识别的方法`touchesMoved:withEvent:`,通过判断触摸点是否在圆点内来确定用户选择的圆点,并绘制用户选择的线条。 ``` - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:self]; for (GestureLockCircle *circle in self.circleArray) { if (CGRectContainsPoint(circle.frame, point) && !circle.selected) { circle.selected = YES; [self.selectedArray addObject:circle]; break; } } self.currentPoint = point; [self setNeedsDisplay]; } ``` 6. 在`GestureLockView`中实现绘制方法`drawRect:`,根据用户选择的圆点绘制线条。 ``` - (void)drawRect:(CGRect)rect { if (self.selectedArray.count == 0) { return; } UIBezierPath *path = [UIBezierPath bezierPath]; path.lineWidth = kLineWidth; path.lineJoinStyle = kCGLineJoinRound; path.lineCapStyle = kCGLineCapRound; [[UIColor whiteColor] set]; for (int i = 0; i < self.selectedArray.count; i++) { GestureLockCircle *circle = self.selectedArray[i]; if (i == 0) { [path moveToPoint:circle.center]; } else { [path addLineToPoint:circle.center]; } } [path addLineToPoint:self.currentPoint]; [path stroke]; } ``` 7. 在`GestureLockView`中实现手势结束的方法`touchesEnded:withEvent:`,判断用户手势是否正确,并通过代理方法通知外部。 ``` - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSMutableString *password = [NSMutableString string]; for (GestureLockCircle *circle in self.selectedArray) { [password appendFormat:@"%ld", circle.tag]; } BOOL success = [password isEqualToString:self.password]; if (success) { for (GestureLockCircle *circle in self.selectedArray) { circle.selected = NO; } [self.selectedArray removeAllObjects]; [self setNeedsDisplay]; if (self.delegate && [self.delegate respondsToSelector:@selector(gestureLockView:didCompleteWithPassword:)]) { [self.delegate gestureLockView:self didCompleteWithPassword:password]; } } else { for (GestureLockCircle *circle in self.selectedArray) { circle.selected = NO; circle.error = YES; } [self.selectedArray removeAllObjects]; [self setNeedsDisplay]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kErrorDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ for (GestureLockCircle *circle in self.circleArray) { circle.error = NO; } [self setNeedsDisplay]; }); } } ``` 8. 在外部创建`GestureLockView`实例,并设置代理方法,实现手势解锁的逻辑。 ``` - (void)viewDidLoad { [super viewDidLoad]; GestureLockView *lockView = [[GestureLockView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenWidth)]; lockView.center = self.view.center; lockView.delegate = self; lockView.password = @"123456789"; [self.view addSubview:lockView]; } #pragma mark - GestureLockViewDelegate - (void)gestureLockView:(GestureLockView *)lockView didCompleteWithPassword:(NSString *)password { NSLog(@"password: %@", password); } ``` 至此,手势解锁的Demo已经完成了,你可以尝试在模拟器或真机上运行它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值