使用 override func draw(_ rect: CGRect) 时显示奇怪的边框

Posted

技术标签:

【中文标题】使用 override func draw(_ rect: CGRect) 时显示奇怪的边框【英文标题】:Strange border shown when override func draw(_ rect: CGRect) is used 【发布时间】:2019-01-21 19:05:52 【问题描述】:

我遇到了无法隐藏的奇怪和不需要的灰色边框的问题。仅当我覆盖 func draw(_ rect: CGRect) 时才会出现灰色的顶部和右侧边框。

出于测试原因,我特意在 layoutSubviews() 中为视图设置了蓝色。但奇怪的边界仍然存在。

我创建了一个按钮:

import UIKit

class CardView: UIButton 
    override func draw(_ rect: CGRect)          
        //activating this function enables the borders, even when I draw a Bezier path in this function the borders doesn't disappear    
    

CardContainerView 中应显示 12 个按钮:

import UIKit

class CardContainerView: UIView 

    // Create Cards
    var cardViews = [CardView]()
        didSet 
            for card in cardViews 
                addSubview(card)
                card.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
                card.layer.borderColor = UIColor.white.cgColor
                card.layer.borderWidth = 0
            
        
    

    private(set) var grid = Grid(layout: Grid.Layout.aspectRatio(3/2))

    /// The centered rect in which the buttons are going to be positioned.
    private var centeredRect: CGRect 
        get 
            return CGRect(x: bounds.size.width * 0.025,
                          y: bounds.size.height * 0.025,
                          width: bounds.size.width * 0.95,
                          height: bounds.size.height * 0.95)
        
    

    override func layoutSubviews() 
        super.layoutSubviews()

        grid.cellCount = cardViews.count
        grid.frame = centeredRect

        for i in 0...cardViews.count 
            if let frame = grid[i] 
                cardViews[i].frame = frame
                cardViews[i].layer.cornerRadius = 10
                cardViews[i].layer.borderColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0)
                cardViews[i].layer.borderWidth = 0.0
            
        
    

我已停用所有边框或使它们对 Card 和 CardContainaer 不可见,但它没有上述边框的效果。只有注释掉覆盖函数 draw(_ rect: CGRect) 才能禁用边框。但是,我需要一个解决方案来绘制一些东西并隐藏边框。你有什么想法?如果你也需要网格对象,可以在这里找到:https://cs193p.stanford.edu/Fall2017/Grid.swift.zip

【问题讨论】:

你能用非零边框宽度测试一下吗?是绘制一个空函数吗?通常建议不要有空的绘制函数。 我已经测试过并上传了图片,见上图。不幸的是,没有变化。我知道不建议使用空函数,但即使我添加 UIBezierpath 并绘制它,奇怪的边框仍然存在。 您可以在创建按钮时尝试将 ButtonType 设置为 .custom 吗?如果需要,请参阅此处***.com/questions/27857163/set-button-type 【参考方案1】:

我找到了问题。我在情节提要中将 cardContainerView 的其中一个约束的高度增加了 1 步。现在线条消失了。似乎是舍入错误或类似的东西导致了这个问题。

【讨论】:

以上是关于使用 override func draw(_ rect: CGRect) 时显示奇怪的边框的主要内容,如果未能解决你的问题,请参考以下文章

使用 gratia::draw() 函数在 R 中创建一个可编辑的局部效应图,该函数也有一个 rugplot

functools.wraps定义函数装饰器

ViewPager的使用

019_go语言中的方法

为啥不调用draw(_ layer: CALayer, in ctx: CGContext) 没有空draw(_ rect: CGRect)?

c++重载(overload)和重写(override)的区别和虚函数