用于自动调整 UIView 的圆角

Posted

技术标签:

【中文标题】用于自动调整 UIView 的圆角【英文标题】:Round corners for autosizing UIView 【发布时间】:2012-05-28 15:21:41 【问题描述】:

是否可以制作圆角(topLeft 和 topRight)来自动调整 uiview? 这是我的代码:

SFDetailViewController.h

@interface SFDetailViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate, PopoverViewListDelegate>

  ...

  UIView *header;

@property (nonatomic, retain) IBOutlet UIView *header;

@end

SFDetailViewController.m

#import "SFDetailViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface SFDetailViewController ()
@end


@implementation SFDetailViewController
@syntesyze header;

-(void) viewDidLoad

    ....
    [self setCornerRadiusToHeader:header];
 



-(void) setCornerRadiusToHeader:(UIView *)headerView
    
    CGRect bounds = headerView.layer.bounds;
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds 
                                               byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                                     cornerRadii:CGSizeMake(8.0, 8.0)];

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = bounds;
    maskLayer.path = maskPath.CGPath;

    [headerView.layer addSublayer:maskLayer];
    headerView.layer.mask = maskLayer; 


视图在 IB 中定义为:

我得到的 - 右上角是直的,因为视图的大小是动态的。

【问题讨论】:

【参考方案1】:

您需要将UIViewcontentMode 属性设置为UIViewContentModeRedrew 之类的属性。内容模式控制视图的内容在其边界发生变化时如何变化(如自动调整大小时)。默认情况下,它只是拉伸视图的内容,这就是你的角被拉伸的原因。

【讨论】:

【参考方案2】:

解决方案:

感谢jbrennan,我设置了

header.contentMode = UIViewContentModeRedraw;

然后,在 viewDidLoad 我调用:

[header setNeedsDisplay];

顺便说一句,我写了以下内容:(void)drawRect:(CGRect)rect

- (void)drawRect:(CGRect)rect
 
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect); 

    UIColor *color = [UIColor lightGrayColor];
    CGContextSetFillColorWithColor(context, color.CGColor);

    CGRect rrect = CGRectMake(CGRectGetMinX(rect)-2, CGRectGetMinY(rect), CGRectGetWidth(rect)+4, CGRectGetHeight(rect) + 1);
    CGFloat radius = 10.0f;

    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);

    CGContextMoveToPoint(context, minx, midy);
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, 0);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, 0);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFill);


结果:

【讨论】:

以上是关于用于自动调整 UIView 的圆角的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIView drawRect 调整大小动画

基于 UITextView 动态调整 CGRect 的大小

仅在 UIView 顶部的圆角

自动调整包含 UITextView 的 UIView

如何以编程方式设置 UIView 的自动调整大小掩码?

创建一个基于 UIView 的子视图自动调整大小的视图