zoukankan      html  css  js  c++  java
  • iOS: 控制UIView的外形

    #import <UIKit/UIKit.h>
    #import <QuartzCore/QuartzCore.h>
    
    @interface UIView (Shape)
    
    - (void)setShape:(CGPathRef)shape;
    @end
    #import "UIView+Shape.h"
    
    @implementation UIView (Shape)
    
    - (void)setShape:(CGPathRef)shape
    {
        if (shape == nil) {
            self.layer.mask = nil;
        }
        
        CAShapeLayer* maskLayer = [CAShapeLayer layer];
        maskLayer.path = shape;
        self.layer.mask = maskLayer;
    }
    
    @end
    @interface UIBezierPath (BasicShape)
    
    + (UIBezierPath *)cutCorner:(CGRect)originalFrame length:(CGFloat)length;
    @end
    #import "UIBezierPath+BasicShape.h"
    
    @implementation UIBezierPath (BasicShape)
    
    + (UIBezierPath *)cutCorner:(CGRect)originalFrame length:(CGFloat)length
    {
        CGRect rect = originalFrame;
        UIBezierPath *bezierPath = [UIBezierPath bezierPath];
    
        [bezierPath moveToPoint:CGPointMake(0, length)];
        [bezierPath addLineToPoint:CGPointMake(length, 0)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width - length, 0)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width, length)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width, rect.size.height - length)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width - length, rect.size.height)];
        [bezierPath addLineToPoint:CGPointMake(length, rect.size.height)];
        [bezierPath addLineToPoint:CGPointMake(0, rect.size.height - length)];
        [bezierPath closePath];
        return bezierPath;
    }
    
    @end

    在[UIView viewWillAppear:]方法中加入下面代码

    [self.view setShape:[UIBezierPath cutCorner:self.view.bounds length:40].CGPath];

    效果:

    ################

    让自定义 Button 响应自定义 Shape 内的点击事件

    #import <UIKit/UIKit.h>
    #import "UIView+Shape.h"
    #import "UIBezierPath+BasicShape.h"
    
    @interface RFButton : UIButton{
        CGPathRef path;
    }
    
    @end
    //
    //  RFButton.m
    //  ChristApp
    //
    //  Created by Haozhen Li on 13-12-6.
    //
    //
    
    #import "RFButton.h"
    
    @implementation RFButton
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }
    
    - (void)setShape:(CGPathRef)shape
    {
        [super setShape:shape];
        path = shape;
    }
    
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        if (CGPathIsEmpty(path)) {
            return YES;
        }
        //判断触发点是否在规定的 Shape 内
        if (CGPathContainsPoint(path, nil, point, nil)) {
            return YES;
        }
        return NO;
    }
    @end
  • 相关阅读:
    maven的pom.xml文件详细说明
    python 给视频添加马赛克
    cv2.VideoCapture 图像旋转问题
    三分钟理解知识蒸馏
    深度学习、机器学习常见概念及理解(持续更新)
    python用直方图规定化实现图像风格转换
    1分钟理解人体姿态估计与行为识别
    数据清洗要点
    3分钟理解NMS非极大值抑制
    python用pandas遍历csv文件
  • 原文地址:https://www.cnblogs.com/ihojin/p/custom-shape-view.html
Copyright © 2011-2022 走看看