如果用自定义子类替换默认视图,cornerRadius 不起作用

Posted

技术标签:

【中文标题】如果用自定义子类替换默认视图,cornerRadius 不起作用【英文标题】:cornerRadius not working if replacing default view with custom subclass 【发布时间】:2012-10-20 15:26:37 【问题描述】:

以下设置:

我有一个 popupViewController,它有一个自定义 UIView 子类作为它的视图,在 loadView 中完成

- (void)loadView

    CGRect startingPopupSize = CGRectMake(0.0f, 0.0f, 300.0f, 160.0f);
    _popupView = [[MoviePopupView alloc] initWithFrame:startingPopupSize];
    self.view = _popupView;

在这个 UIView 子类中,我的 init 方法中有以下代码

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 

        // Initialization code
        self.layer.masksToBounds = YES;
        self.layer.opaque = NO;
        self.clipsToBounds = YES;
        self.backgroundColor = [UIColor whiteColor];
        self.layer.borderWidth = 1.0f;
        self.layer.cornerRadius = 10.0f;
    
    return self;

问题是,cornerRadius 不适用于此视图,但会绘制边框,请参见此处:

如果我不使用 uiviewcontroller 的默认 uiview 替换此视图,而是将其添加为子视图,cornerRadius 工作正常(我想替换它有几个原因)。

任何想法为什么这不起作用?


编辑:

如果我只是将层masksToBounds = YES 属性从initWithFrame 方法移动到drawRect 方法它可以工作。将其移至其视图控制器 viewDidLoad 不会。

- (void)drawRect:(CGRect)rect

    // Drawing code
    self.layer.masksToBounds = YES;


任何想法为什么这有效?我认为这里不适合设置此属性。

【问题讨论】:

你试过了吗:1)设置self.layer.masksToBounds = YES 2)在viewDidLoad中设置cornerRadius,而不是initWithFrame? 如您所见,self.layer.masksToBounds = YES 已设置,我尝试在其视图控制器的 viewDidLoad 方法中设置它,而不是它自己的 initWithFrame:没有任何变化。 您找到解决方案了吗?我有同样的问题 【参考方案1】:

你应该做两个视图:

背景视图 文本视图

对于您想要的文本背景的背景视图设置颜色。 对于文本视图,将背景颜色设置为透明色。

【讨论】:

这不会改变任何东西。导航栏和其他子视图仍然显示在边缘

以上是关于如果用自定义子类替换默认视图,cornerRadius 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

用自定义警报视图替换对话框“打开位置服务以允许应用程序确定您的位置服务”[关闭]

php 用自定义WordPress仪表板替换默认的WordPress仪表板

用自定义函数替换 Print 语句调用

php 用自定义徽标替换仪表板WordPress徽标

是否可以用自定义 UI 替换 Android 的内置 Caller?

用自定义模板 grails 上的普通字段替换 <f:all /> 标记