iOS开发UI篇-常用控件详解(UIView)

一. 常用属性


  • 1.alpha(不透明度)
    设置视图的不透明度.默认为1.


view.alpha = 0;// 完全透明
view.alpha = 1;// 不透明

  • 2.clipsToBounds默认是NO,当设置为yes时,超出当前视图的尺寸的内容和子视图不会显示。
  • 3.hidden 默认是NO,当设置为yes,视图就看不见了。

  • 4.userInteractionEnabled 默认为YES,如果设置为No,view就不能和用户交互了。(即不能响应事件)

  • 5.tag
    默认为0,用来标记视图的
  • 6.exclusiveTouch默认为No,exclusiveTouch的意义在于:如果当前设置了exclusiveTouch的UIView是整个触摸事件的第一响应者,那么到你所有的手指离开屏幕前其他的UIView是无法接受到整个事件周期内所有的触摸事件。
  • 7.CGRect frame
    • 1> 表示控件的位置和尺寸(以父控件的左上角为坐标原点(0, 0))
    • 2> 修改这个属性,可以调整控件的位置和尺寸
  • 8.CGPoint center

    • 1> 表示控件的中点(以父控件的左上角为坐标原点)
    • 2> 修改这个属性,可以调整控件的位置
  • 9.CGRect bounds

    • 1> 表示控件的位置和尺寸(以自己的左上角位坐标原点,位置永远是(0, 0))
    • 2> 修改这个属性,只能调整控件的尺寸
  • 10.CGAffineTransform transform

    • 1> 表示控件的形变状态(旋转角度、缩放比例)
    • 2> 创建CGAffineTransform的函数
    • CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
      创建一个x、y方向的缩放比例分别为sx、sy的形变值

    • CGAffineTransformMakeRotation(CGFloat angle)
      创建一个旋转角度为angle的形变值

    • CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)
      在形变值t的基础上,再进行缩放,x、y方向的缩放比例分别为sx、sy,然后返回一个新的形变值

    • CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)
      在形变值t的基础上,再进行旋转,旋转角度为angle,然后返回一个新的形变值

  • 11.superview返回当前视图的父视图。(只读)
  • 12.window返回当前视图的窗口。(窗口)

获取根视图的superview和window时,需要注意,在viewdidload中是获取不到的,viewdidload只是视图加载完成,并没有添加到窗口中,因此需要在viewDidAppear方法中才能获取到。那时候视图才被添加到窗口中。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"%@",self.view.superview); // 没有值
    NSLog(@"%@", self.view.window); // 没有值
}
- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%@",self.view.superview); // 有值
    NSLog(@"%@", self.view.window);  // 有值
}
  • 13.autoresizesSubviews默认为YES,表示当父视图尺寸改变时,子视图也会随着改变。
  • 14.autoresizingMask默认为UIViewAutoresizingNone,不会自动伸缩。
  • 15.contentMode设置内容模式。
    • UIViewContentModeScaleToFill 不按照原宽高比例(长和宽不等比例增长)以任意比例填充。这样视图不会有空白,且内容可以全部显示。
    • UIViewContentModeAspectToFill 按照原长宽比例填充,不完全显示全部内容。这样内容可能溢出,但整个视图不会留有空白。
    • UIViewContentModeAspectToFit 按照原长宽比例(长和宽等比例增长),完全显示全部内容。这样容易照成左右或者上下留有空白。
  • 16.backgroundColor默认是nil。

二. 常用方法


  • 1、addSubview:
    • 添加一个子视图到接收者并让它在最上面显示出来.
  • 2、bringSubviewToFront:
    • 把指定的子视图移动到顶层.
      -(void)bringSubviewToFront:(UIView *)view
      参数说明:view为需要移到顶层的视图
  • 3、convertPoint:fromView:
    • 把一个点从一个坐标系转换到接收者的坐标系
  • 4、convertPoint:toView:
    • 转换一个点从接收者坐标系到给定的视图坐标
  • 5、convertRect:fromView:
    • 转换一个矩形从其他视图坐标系到接收者坐标系。 如果参数视图是nil,那么这个方法将会基于窗口来转换。否则视图和接收者必须都属于同一个UIWindow对象
  • 6、convertRect:toView:
    • 转换接收者坐标系中的矩形到其他视图。如果参数视图是nil,这个方法将会基于窗口坐标系来转换。否则视图和接收者必须属于同一个UIWindow对象
  • 7、didAddSubview:
    • 告诉视图当子视图已经添加,被子类重写用来执行额外的命令当子视图添加到接收者。这个方法被addSubview调用 didMoveToSuperview 通知接收者父视图已经改变(nil是允许的) 默认不做任何事情;子类可以重写这方法来作为特定的实现
  • 8、didMoveToWindow
    • 通知接收者它已经被添加到窗口中 - (void)didMoveToWindow
      默认实现不做任何事情,子类可以重写这个方法来做特殊的实现;
      窗口的属性有可能是nil当这个方法调用的时候,这表明接收者并不属于当然任何一个窗口。这个只发生在接收者从它的父视图上移除或者接收者添加到父视图中而不是添加到window中。重写这个方法可以用来选择忽略一些他们不关心的对象
  • 9、drawRect:
    • 在接收者视图中绘制矩形 - (void)drawRect:(CGRect)rect 参数 rect 一个定义的需要绘制的矩形
      子类重写这个方法如果他们确实要绘制他们自定义的视图。如果子类是其他视图的容器那么它不需要重写这个方法。默认的实现不做任何事情。如果你自定义的视图是一个UIView子类,你不需要去调用它的父类实现。注意如果它的父类实现绘制并且不透明属性为YES那么每一个子类都需要填充矩形。 当这个方法被调用,接收者可以假定他的帧在坐标上已经转换,边界矩形已经应用;所有他要做的就是绘制自定义的方法。
      使用UIGraphicsGetCurrentContext方法去获取当前图形内容用来绘制,坐标原点在左上角。
      不要保留图片内容当他可以被drawRect:这个方法调用。
      exchangeSubviewAtIndex:withSubviewAtIndex: 交换接收者的子视图和给定的索引视图 - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2 参数 index1 一个需要取代索引2的子视图 index2 一个需要取代索引1的子视图
  • 10、hitTest:withEvent:
    • 返回接收者视图层次中最远的派生(包括它本身)的特定的点。
      - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 参数 point 接收者坐标系中的点 event 触发这个方法的事件或者是如果这个方法被预调用就返回nil 返回值 一个视图对象最远的派生点。如果这个点位于接收者之外就返回nil.
      这个方法贯穿视图的层次发送pointInside:withEvent: 消息到每一个子视图用来决定那个子视图需要接收触摸事件。如果pointInside:withEvent: 返回YES,那么视图的层次全部贯穿;否则视图层次的分支是被否定的。
      你不太需要调用这个方法,但是你需要重写它用来隐藏子视图的触摸事件。 如果视图是隐藏的,禁止用户交互的或者透明值小于01那么这个方法不可用
  • 11、initWithFrame:
    • 初始化并返回一个新的拥有特定帧矩形的视图对象
      - (id)initWithFrame:(CGRect)aRect参数 aRect 一个帧矩形用来创建视图对象。原始的帧在它的父视图的坐标系中。设置这个属性用来改变中心和边界属性。 返回值 一个初始化的视图对象,如果没有被创建那就返回nil 讨论 一个新的视图对象必须添加到视图链中才能使用。这个方法为UIView类指出初始化对象。
  • 12、insertSubview:aboveSubview:
    • 在视图层次顶层插入一个视图
      - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview 参数 view 一个插入被用来放在顶层的视图。它将会从父视图中移除如果它不是相邻视图 siblingSubview 一个相邻视图用来放在插入视图的後面
  • 13、insertSubview:atIndex:
    • 插入视图到指定的索引
      - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index 参数 view 插入的视图,这个值不能是nil index 子视图索引从0开始并且不能大于子视图的数量
  • 14、insertSubview:belowSubview:
    • 插入视图到显示链的底层
      - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview参数 view 一个需要插入到其他视图底部的视图。它将从它的父视图移除如果它不与相邻视图的相邻 siblingSubview 一个相邻视图将会在插入的视图之上
  • 15、isDescendantOfView:
    • 返回一个布尔值指出接收者是否是给定视图的子视图或者指向那个视图
      - (BOOL)isDescendantOfView:(UIView *)view 参数 view 一个视图用来测试子视图在视图层次中的关系 返回值 如果接收者是视图的子视图就返回YES,或者视图就是接收者;否则就是NO
  • 16、layoutIfNeeded
    • 排列子视图如果需要的话
      - (void)layoutIfNeeded
      使用这个方法来关注子视图的排列在绘制前
  • 17、layoutSubviews
    • 排列子视图
      - (void)layoutSubviews
      当layoutIfNeeded被调用是子类用来重写这个方法来排列子视图。默认实现这个方法不做任何事情。
  • 18、pointInside:withEvent:
    • 返回一个布尔值指出接收者是否包含特定的点
      - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event参数 point 一个在接收者坐标系内的点 event 这个方法的目标事件或者如果这个方法被预调用返回nil 返回值 如果点在接收者边界内返回YES,否则返回NO
  • 19、removeFromSuperview
    • 把接收者从它的父视图或者窗口移除,并在响应链中移除。
      - (void)removeFromSuperview
      接收者同时释放;如果你计划重用它,要确定在发送消息前保持它并在添加到其他UIView对象作为子视图後移除。 不要在显示的时候调用
  • 20、sendSubviewToBack:
    • 移动指定的子视图到它相邻视图的後面
      - (void)sendSubviewToBack:(UIView *)view 参数 view 一个子视图用来移动到它後面去
  • 21、setNeedsDisplay
    • 控制接收者的边界矩形被标记为需要显示
      -(void)setNeedsDisplay
      默认情况下,视图几何图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。从这个意义上来说,向视图发送setNeedsDisplay消息。任何UIView对象标记为需要显示後将会在应用程序循环中自动重新绘制。
  • 22、setNeedsDisplayInRect:
    • 标记接收者中的特定的矩形区域为需要显示,或者添加接收者现有的其他无效区域
      - (void)setNeedsDisplayInRect:(CGRect)invalidRect 参数 invalidRect 标记接收者的矩形区域为无效的;他需要在接收者坐标系中定义。
      默认情况下,视图几何图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。使用这个方法或者用setNeedsDisplay方法来标记视图需要显示的地方。
  • 23、setNeedsLayout
    • 设置当子视图显示的时候需要重新排列
      - (void)setNeedsLayout
      如果你调用这个方法在下一个显示方法之间,那么layoutIfNeeded排列子视图;否则将不会做任何事情
  • 24、sizeThatFits:
    • 计算并返回一个最好的适应接收者子视图的大小
      - (CGSize)sizeThatFits:(CGSize)size 参数 size 接收者首选的尺寸 返回值 一个新的大小用来适应接收者子视图
      默认的实现返回大小参数
      子类重写这个方法用来返回特定视图的大小。举个粒子,UISwitch返回一个修正过的大小,UIImageView返回图片的大小 这个方法并没有改变接收者的大小
  • 25、sizeToFit
    • 调整大小并移动接收者视图大小所以他包含了他的子视图
      - (void)sizeToFit讨论 这个方法使用sizeThatFits: 方法来决定大小。
      子类需要重写sizeThatFits:用来计算正确的尺寸大小。
      默认的实现不做任何事情。
  • 26、viewWithTag:
    • 返回视图的特定的标签
      - (UIView *)viewWithTag:(NSInteger)tag 参数 tag 一个用来在视图中搜索的标签 返回值 视图在接收者层次中符合的标签,接收者也包含在搜索中。
  • 27、willMoveToSuperview:
    • 通知接收者他的父视图将会改变到特定的父视图(也有可能是nil)
      - (void)willMoveToSuperview:(UIView *)newSuperview 参数 newSuperview 新的视图对象将会是接收者新的父视图 讨论 子类可以重写这个方法来做一些特定的行为
  • 28、willMoveToWindow:
    • 通知接收者它已经被添加到特定的窗口对戏那个的视图层次中(也有可能是nil)
      - (void)willMoveToWindow:(UIWindow *)newWindow 参数 newWindow 一个窗口对象将会成为接收者新的视图层次的根视图
      子类可以重写这个方法来提供一些特定的必要实现
  • 29、willRemoveSubview:
    • 由子类重写用来在子视图从接收者视图中移除前执行一些特定的方法。
      - (void)willRemoveSubview:(UIView *)subview 参数 subview 子视图将会被移除.
      这个方法被调用当子视图接收到removeFromSuperview消息或者子视图从接收者视图层次中移除因为它要被添加到其他视图了

三. 其他(绘图相关方法)


  • 1、drawAtPoint:: mode = kCGBlendModeNormal, alpha = 1.0。在 Point这个点绘图。
    - (void)drawAtPoint: (CGPoint)point;

  • 2、drawAtPoint:blendMode: alpha::在 Point这个点,以某种模式绘图。
    - (void)drawAtPoint: (CGPoint)point blendMode: (CGBlendMode)blendMode alpha: (CGFloat)alpha;

  • 3、drawInRect::mode = kCGBlendModeNormal, alpha = 1.0。在某个具体位置进行绘图。
    - (void)drawInRect: (CGRect)rect;

  • 4、drawInRect: blendMode:alpha::在某个具体位置,以某种模式,某种透明度进行绘图。
    - (void)drawInRect: (CGRect)rect blendMode: (CGBlendMode)blendMode alpha: (CGFloat)alpha;

  • 5、drawAsPatternInRect::draws the image as a CGPattern.在某个具体位置平铺图像。
    - (void)drawAsPatternInRect: (CGRect)rect;

  • 6、resizableImageWithCapInsets::创建并返回一个指定边距的图像对象。
    - (UIImage *)resizableImageWithCapInsets: (UIEdgeInsets)capInsets;

  • 7、resizableImageWithCapInsets:resizingMode::创建并返回一个指定边距和伸缩模式的图片对象。
    - (UIImage *)resizableImageWithCapInsets: (UIEdgeInsets)capInsets resizingMode: (UIImageResizingMode)resizingMode NS_AVAILABLE_IOS(6_0);

  • 8、imageWithAlignmentRectInsets::返回一个指定了对齐方式的图片,一个新的图片对象。
    -(UIImage*)imageWithAlignmentRectInsets: (UIEdgeInsets)alignmentInsets NS_AVAILABLE_IOS(6_0);

  • 9、imageWithRenderingMode::根据渲染模式,创建一并返回一个新的图片对象
    -(UIImage*)imageWithRenderingMode: (UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0);

  • 10、imageFlippedForRightToLeftLayoutDirection::返回当前图片,准备水平旋转时,它会从右向左布局。
    -(UIImage*)imageFlippedForRightToLeftLayoutDirection NS_AVAILABLE_IOS(9_0);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值