如何是实现上面左右两边有圆角,下面没有圆角

简介: 如何是实现上面左右两边有圆角,下面没有圆角

画圆角参考:《如何实现画圆角》。

方法一:自己画圆角。

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSUInteger, ERectangleCornerType)
{
    ERectangleCornerTypeNoCorner = 0,     //无圆角
    ERectangleCornerTypeUpLeftRight = 1,     //上部左右两个圆角
    ERectangleCornerTypeDownLeftRight = 2,   //下部左右两个圆角
    ERectangleCornerTypeLeftUpDown = 3,   //左边上下两个个圆角
    ERectangleCornerTypeRighUpDown = 4,   //右边上下两个圆角
    ERectangleCornerTypeAllCorner = 5,   //上下部左右四个圆角
};

@interface PPRectangleCornerView : BGBaseView
@property (nonatomic, strong) UIColor *fillColor;
@property (nonatomic, assign) CGFloat radius;
@property (nonatomic, assign) ERectangleCornerType rectangleCornerType;

- (instancetype)initWithFrame:(CGRect)frame radius:(CGFloat)radius fillColor:(UIColor *)fillColor rectangleCornerType:(ERectangleCornerType)rectangleCornerType;
@end

NS_ASSUME_NONNULL_END
#import "PPRectangleCornerView.h"
#import "PPSectorView.h"

@interface PPRectangleCornerView ()
@property (nonatomic, strong) PPSectorView *leftUpSectorView;
@property (nonatomic, strong) PPSectorView *rightUpSectorView;
@property (nonatomic, strong) PPSectorView *leftDownSectorView;
@property (nonatomic, strong) PPSectorView *rightDownSectorView;
@property (nonatomic, strong) UIView *centerView;
@property (nonatomic, strong) UIView *leftMiddleView;
@property (nonatomic, strong) UIView *rightMiddleView;
@property (nonatomic, strong) UIView *upMiddleView;
@property (nonatomic, strong) UIView *downMiddleView;
@end

@implementation PPRectangleCornerView

- (instancetype)initWithFrame:(CGRect)frame radius:(CGFloat)radius fillColor:(UIColor *)fillColor rectangleCornerType:(ERectangleCornerType)rectangleCornerType
{
    if(radius <= 0 || !fillColor)
    {
        return nil;
    }

    if((ERectangleCornerTypeNoCorner == rectangleCornerType || ERectangleCornerTypeUpLeftRight == rectangleCornerType || ERectangleCornerTypeDownLeftRight == rectangleCornerType || ERectangleCornerTypeAllCorner == rectangleCornerType) &&(frame.size.width <= radius*2 || frame.size.height <= radius*2))
    {
        return nil;
    }
    else if(frame.size.width <= radius || frame.size.height <= radius*2)
    {
        return nil;
    }
    self = [super initWithFrame:frame];
    if (self) {
        [self setAttributesWithRadius:radius fillColor:fillColor rectangleCornerType:rectangleCornerType];
        [self addSubview:self.leftUpSectorView];
        [self addSubview:self.rightUpSectorView];
        [self addSubview:self.leftDownSectorView];
        [self addSubview:self.rightDownSectorView];
        [self addSubview:self.leftMiddleView];
        [self addSubview:self.rightMiddleView];
        [self addSubview:self.upMiddleView];
        [self addSubview:self.downMiddleView];
        [self addSubview:self.centerView];
    }
    return self;
}

-(PPSectorView *)leftUpSectorView{
    if (!_leftUpSectorView) {
        _leftUpSectorView = [[PPSectorView alloc] init];
        if(ERectangleCornerTypeUpLeftRight == self.rectangleCornerType || ERectangleCornerTypeLeftUpDown == self.rectangleCornerType || ERectangleCornerTypeAllCorner == self.rectangleCornerType )
        {
            [_leftUpSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeLeftUp];
            _leftUpSectorView.frame = CGRectMake(0, 0, self.radius, self.radius);
        }
        else
        {
            [_leftUpSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeRectangle];
            
            if(ERectangleCornerTypeRighUpDown == self.rectangleCornerType && self.frame.size.width < self.radius*2)
            {
                _leftUpSectorView.frame = CGRectMake(0, 0, (self.frame.size.width-self.radius)/2, self.radius);
            }
            else
            {
                _leftUpSectorView.frame = CGRectMake(0, 0, self.radius, self.radius);
            }
        }
    }
    return _leftUpSectorView;
}

-(PPSectorView *)rightUpSectorView{
    if (!_rightUpSectorView) {
        _rightUpSectorView = [[PPSectorView alloc] init];
        if(ERectangleCornerTypeUpLeftRight == self.rectangleCornerType || ERectangleCornerTypeRighUpDown == self.rectangleCornerType || ERectangleCornerTypeAllCorner == self.rectangleCornerType )
        {
            [_rightUpSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeRightUp];
            _rightUpSectorView.frame = CGRectMake(self.frame.size.width-self.radius, 0, self.radius, self.radius);
        }
        else
        {
            [_rightUpSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeRectangle];
            if(ERectangleCornerTypeLeftUpDown == self.rectangleCornerType && self.frame.size.width < self.radius*2)
            {
                _rightUpSectorView.frame = CGRectMake(self.radius + (self.frame.size.width-self.radius)/2, 0, (self.frame.size.width-self.radius)/2, self.radius);
            }
            else
            {
                _rightUpSectorView.frame = CGRectMake(self.frame.size.width-self.radius, 0, self.radius, self.radius);
            }
            
        }
    }
    return _rightUpSectorView;
}

-(PPSectorView *)leftDownSectorView{
    if (!_leftDownSectorView) {
        _leftDownSectorView = [[PPSectorView alloc] init];
        if(ERectangleCornerTypeDownLeftRight == self.rectangleCornerType || ERectangleCornerTypeLeftUpDown == self.rectangleCornerType || ERectangleCornerTypeAllCorner == self.rectangleCornerType )
        {
            [_leftDownSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeLeftDown];
            _leftDownSectorView.frame = CGRectMake(0, self.frame.size.height- self.radius, self.radius, self.radius);
        }
        else
        {
            if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
            {
                _leftDownSectorView.frame = CGRectMake(0, self.frame.size.height- self.radius, (self.frame.size.width-self.radius)/2, self.radius);
            }
            else
            {
                _leftDownSectorView.frame = CGRectMake(0, self.frame.size.height- self.radius, self.radius, self.radius);
            }
            [_leftDownSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeRectangle];
        }
    }
    return _leftDownSectorView;
}

-(PPSectorView *)rightDownSectorView{
    if (!_rightDownSectorView) {
        _rightDownSectorView = [[PPSectorView alloc] init];
        if(ERectangleCornerTypeDownLeftRight == self.rectangleCornerType || ERectangleCornerTypeRighUpDown == self.rectangleCornerType || ERectangleCornerTypeAllCorner == self.rectangleCornerType )
        {
            [_rightDownSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeRightDown];
            _rightDownSectorView.frame = CGRectMake(self.frame.size.width-self.radius, self.frame.size.height- self.radius, self.radius, self.radius);
        }
        else
        {
            [_rightDownSectorView setAttributesWithIsBackgroundClear:YES radius:self.radius fillColor:_fillColor sectorType:ESectorTypeRectangle];
            if((ERectangleCornerTypeLeftUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
            {
                _rightDownSectorView.frame = CGRectMake(self.frame.size.width-(self.frame.size.width-self.radius)/2, self.frame.size.height- self.radius, (self.frame.size.width-self.radius)/2, self.radius);
            }
//            else if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
//            {
//                _rightDownSectorView.frame = CGRectMake(self.frame.size.width-(self.frame.size.width-self.radius)/2, self.frame.size.height- self.radius, (self.frame.size.width-self.radius)/2, self.radius);
//            }
            else
            {
                _rightDownSectorView.frame = CGRectMake(self.frame.size.width-self.radius, self.frame.size.height- self.radius, self.radius, self.radius);
            }
        }
    }
    return _rightDownSectorView;
}

-(UIView *)leftMiddleView{
    if (!_leftMiddleView) {
//        if((ERectangleCornerTypeLeftUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
//        {
//            _leftMiddleView= [[UIView alloc] initWithFrame:CGRectMake(0, self.radius, self.radius, self.frame.size.height- self.radius*2)];
//        }
//        else
        if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _leftMiddleView= [[UIView alloc] initWithFrame:CGRectMake(0, self.radius, (self.frame.size.width-self.radius)/2, self.frame.size.height- self.radius*2)];
        }
        else
        {
            _leftMiddleView= [[UIView alloc] initWithFrame:CGRectMake(0, self.radius, self.radius, self.frame.size.height- self.radius*2)];
        }
        _leftMiddleView.backgroundColor = self.fillColor;
    }
    return _leftMiddleView;
}

-(UIView *)rightMiddleView{
    if (!_rightMiddleView) {
        if((ERectangleCornerTypeLeftUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _rightMiddleView= [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width - (self.frame.size.width-self.radius)/2, self.radius, (self.frame.size.width-self.radius)/2, self.frame.size.height- self.radius*2)];
        }
//        else if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
//        {
//            _rightMiddleView= [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width - self.radius, self.radius, self.radius, self.frame.size.height- self.radius*2)];
//        }
        else
        {
            _rightMiddleView= [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width - self.radius, self.radius, self.radius, self.frame.size.height- self.radius*2)];
        }

        _rightMiddleView.backgroundColor = self.fillColor;
    }
    return _rightMiddleView;
}

-(UIView *)upMiddleView{
    if (!_upMiddleView) {
        if((ERectangleCornerTypeLeftUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _upMiddleView = [[UIView alloc] initWithFrame:CGRectMake(self.radius, 0, (self.frame.size.width-self.radius)/2, self.radius)];
        }
        else if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _upMiddleView = [[UIView alloc] initWithFrame:CGRectMake((self.frame.size.width-self.radius)/2, 0, (self.frame.size.width-self.radius)/2, self.radius)];
        }
        else
        {
            _upMiddleView = [[UIView alloc] initWithFrame:CGRectMake(self.radius, 0, self.frame.size.width - self.radius*2, self.radius)];
        }
        
        _upMiddleView.backgroundColor = self.fillColor;
    }
    return _upMiddleView;
}

-(UIView *)downMiddleView{
    if (!_downMiddleView) {
        if((ERectangleCornerTypeLeftUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _downMiddleView= [[UIView alloc] initWithFrame:CGRectMake(self.radius, self.frame.size.height- self.radius, (self.frame.size.width-self.radius)/2, self.radius)];
        }
        else if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _downMiddleView= [[UIView alloc] initWithFrame:CGRectMake((self.frame.size.width-self.radius)/2, self.frame.size.height- self.radius, (self.frame.size.width-self.radius)/2, self.radius)];
        }
        else
        {
            _downMiddleView= [[UIView alloc] initWithFrame:CGRectMake(self.radius, self.frame.size.height- self.radius, self.frame.size.width - self.radius*2, self.radius)];
        }
        _downMiddleView.backgroundColor = self.fillColor;
    }
    return _downMiddleView;
}

-(UIView *)centerView{
    if (!_centerView) {
        if((ERectangleCornerTypeLeftUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _centerView = [[UIView alloc] initWithFrame:CGRectMake(self.radius, self.radius, (self.frame.size.width-self.radius)/2, self.frame.size.height - self.radius*2)];
        }
        else if((ERectangleCornerTypeRighUpDown == self.rectangleCornerType) && self.frame.size.width < self.radius*2)
        {
            _centerView = [[UIView alloc] initWithFrame:CGRectMake((self.frame.size.width-self.radius)/2, self.radius, (self.frame.size.width-self.radius)/2, self.frame.size.height - self.radius*2)];
        }
        else
        {
            _centerView = [[UIView alloc] initWithFrame:CGRectMake(self.radius, self.radius, self.frame.size.width-self.radius*2, self.frame.size.height - self.radius*2)];
        }
        _centerView.backgroundColor = self.fillColor;
    }
    return _centerView;
}

-(void)setAttributesWithRadius:(CGFloat)radius fillColor:(UIColor *)fillColor rectangleCornerType:(ERectangleCornerType)rectangleCornerType
{
    self.radius = radius;
    self.fillColor = fillColor;
    self.rectangleCornerType = rectangleCornerType;
    self.backgroundColor = [UIColor clearColor];
}
@end

方法二:用贝塞尔曲线实现。

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {

UIRectCornerTopLeft = 1 << 0,

UIRectCornerTopRight = 1 << 1,

UIRectCornerBottomLeft = 1 << 2,

UIRectCornerBottomRight = 1 << 3,

UIRectCornerAllCorners = ~0UL

};

    CGSize radii = CGSizeMake(15, 15);
    // 随意改变4个圆角
    UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight;
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:_photoImageView.bounds byRoundingCorners:corners cornerRadii:radii];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = path.CGPath;
    maskLayer.masksToBounds = NO;
    _photoImageView.layer.mask = maskLayer;
目录
相关文章
|
人工智能 自然语言处理 测试技术
Claude 3非常厉害,但是国内用不上怎么办?
【2月更文挑战第16天】Claude 3非常厉害,但是国内用不上怎么办?
5491 1
Claude 3非常厉害,但是国内用不上怎么办?
|
SQL 分布式计算 数据安全/隐私保护
如何杜绝 spark history server ui 的未授权访问? 1
如何杜绝 spark history server ui 的未授权访问?
|
搜索推荐 前端开发 测试技术
Flutter 中获取地理位置[Flutter专题61]
Flutter 中获取地理位置 如今,发现用户位置是移动应用程序非常常见且功能强大的用例。如果您曾经尝试过在 Android 中实现位置,您就会知道样例代码会变得多么复杂和混乱。
525 0
Flutter 中获取地理位置[Flutter专题61]
|
9月前
|
Java Android开发
Android背景颜色滑动渐变效果(上下滑动,左右滑动)
本文分享了一种通过ScrollView实现滑动变色效果的简单方法。主要步骤包括:1) 在布局中添加ScrollView并确保内容可滑动;2) 获取屏幕高度;3) 获取控件高度;4) 使用GradientDrawable设置渐变颜色;5) 根据控件与屏幕高度比例动态调整颜色数量。示例代码展示了如何在滑动时根据比例改变背景颜色,实现流畅的视觉效果。
255 0
|
11月前
|
人工智能 并行计算 测试技术
Claude 3.7登顶webdev榜首,国内怎么使用Claude 3.7
Claude 3.7 登顶 Webdev 榜首,Claude 3.7 Sonnet 以 1363.7 分的竞技场评分位列榜首,远超第二名。相比前代,它在数学与编码能力上提升显著,尤其在代理编码测试中准确率达 62.3%,工具交互测试中达 81.2% 的 SOTA 表现。支持 128k Token 输入,上下文处理能力提升 16 倍,并引入扩展思考模式,大幅提升复杂任务解决效率。 Claude 3.7 是 Anthropic 推出的新一代 LLM,具备卓越的推理和编程能力。国内用户可参考特定指南注册使用。
1249 14
Claude 3.7登顶webdev榜首,国内怎么使用Claude 3.7
CORS 报错的常见原因
【10月更文挑战第6天】
|
iOS开发 MacOS
macOS10.13.6及以下版本不能自动升级到更高版本的解决方案
macOS10.13.6及以下版本不能自动升级到更高版本的解决方案
2599 1
|
Linux 开发工具 Android开发
Flutter之搭建环境
Flutter之搭建环境
|
缓存 JavaScript API
Flutter&鸿蒙next 状态管理框架对比分析
在 Flutter 开发中,状态管理至关重要,直接影响应用的性能和可维护性。本文对比分析了常见的状态管理框架,包括 setState()、InheritedWidget、Provider、Riverpod、Bloc 和 GetX,详细介绍了它们的优缺点及适用场景,并提供了 Provider 的示例代码。选择合适的状态管理框架需考虑应用复杂度、团队熟悉程度和性能要求。
802 0
|
存储 自然语言处理 API
Flutter应用的国际化支持:实现多语言环境的优雅策略
【4月更文挑战第26天】Flutter提供强大的国际化(i18n)和本地化(l10n)支持,使开发者能轻松实现应用多语言特性。通过定义`.arb`文件来管理字符串资源,使用`LocalizationsDelegate`加载资源,设置应用语言环境,以及在UI中使用`S.of(context).someString`访问字符串。进阶技巧包括字符串格式化、复数形式、双向文本和Unicode支持。充分测试确保所有语言正确显示。随着全球化需求增长,Flutter的国际化支持成为应用开发关键。