将角半径应用于 Storyboard 内的特定 UIView 角并不适用于所有角

2024-05-07

我为此创建了一个自定义类。但它仅适用于左上角,不适用于其他位置:

@IBDesignable
public class RoundedView: UIView {

    @IBInspectable public var topLeft: Bool = false
    @IBInspectable public var topRight: Bool = false
    @IBInspectable public var bottomLeft: Bool = false
    @IBInspectable public var bottomRight: Bool = false
    @IBInspectable public var cornerRadius: Int = 0

    public override func awakeFromNib() {
        var options = UIRectCorner()

        if topLeft { options =  options.union(.topLeft) }
        if topRight { options =  options.union(.topRight) }
        if bottomLeft { options =  options.union(.bottomLeft) }
        if bottomRight { options =  options.union(.bottomRight) }

        let path = UIBezierPath(roundedRect:self.bounds,
                                byRoundingCorners:options,
                                cornerRadii: CGSize(width: cornerRadius, height: cornerRadius))

        let maskLayer = CAShapeLayer()

        maskLayer.path = path.cgPath
        self.layer.mask = maskLayer
    }
}

这是在模拟器中运行时的样子,我为所有 4 个角应用了角半径:

这里发生了什么 ? TopLeft 可以使用,TopRight 可以使用,而底角则不能使用。我很困惑。


您应该在覆盖中更新掩码layoutSubviews。随着约束条件的更新frame的观点,layoutSubviews被调用,所以这是更新掩码的正确位置。


顺便说一句,我不鼓励使用awakeFromNib配置视图。如果您使用情节提要,它可以正常工作,但以编程方式创建的视图不会调用它。如果您确实想在创建视图时对其进行配置,最好将代码放在一些私有配置方法中,该方法由init(frame:) and init(coder:)。这样,它既适用于故事板,也适用于以编程方式创建的视图。

我还可能建议观察者观察可检查的属性,以触发圆角的更新。如果更改这些属性,您希望圆角自动更新。


Thus:

@IBDesignable
public class RoundedView: UIView {

    @IBInspectable public var topLeft: Bool = false      { didSet { setNeedsLayout() } }
    @IBInspectable public var topRight: Bool = false     { didSet { setNeedsLayout() } }
    @IBInspectable public var bottomLeft: Bool = false   { didSet { setNeedsLayout() } }
    @IBInspectable public var bottomRight: Bool = false  { didSet { setNeedsLayout() } }
    @IBInspectable public var cornerRadius: CGFloat = 0  { didSet { setNeedsLayout() } }

    public override func layoutSubviews() {
        super.layoutSubviews()

        var options = UIRectCorner()

        if topLeft     { options.formUnion(.topLeft) }
        if topRight    { options.formUnion(.topRight) }
        if bottomLeft  { options.formUnion(.bottomLeft) }
        if bottomRight { options.formUnion(.bottomRight) }

        let path = UIBezierPath(roundedRect: bounds,
                                byRoundingCorners: options,
                                cornerRadii: CGSize(width: cornerRadius, height: cornerRadius))

        let maskLayer = CAShapeLayer()

        maskLayer.path = path.cgPath
        layer.mask = maskLayer
    }
}

或者,如果针对 iOS 11 及更高版本,我们可以让 CoreAnimation 进行舍入:

@IBDesignable
public class RoundedView: UIView {

    @IBInspectable public var topLeft: Bool = false      { didSet { updateCorners() } }
    @IBInspectable public var topRight: Bool = false     { didSet { updateCorners() } }
    @IBInspectable public var bottomLeft: Bool = false   { didSet { updateCorners() } }
    @IBInspectable public var bottomRight: Bool = false  { didSet { updateCorners() } }
    @IBInspectable public var cornerRadius: CGFloat = 0  { didSet { updateCorners() } }

    public override init(frame: CGRect = .zero) {
        super.init(frame: frame)
        updateCorners()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        updateCorners()
    }
}

private extension RoundedView {
    func updateCorners() {
        var corners = CACornerMask()

        if topLeft     { corners.formUnion(.layerMinXMinYCorner) }
        if topRight    { corners.formUnion(.layerMaxXMinYCorner) }
        if bottomLeft  { corners.formUnion(.layerMinXMaxYCorner) }
        if bottomRight { corners.formUnion(.layerMaxXMaxYCorner) }

        layer.maskedCorners = corners
        layer.cornerRadius = cornerRadius
    }
}

后一种方法的好处是,如果我们碰巧要为frame视图的:

如果您使用上述layoutSubviews方法,那么你必须手动管理动画(例如使用CADisplayLink).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将角半径应用于 Storyboard 内的特定 UIView 角并不适用于所有角 的相关文章

  • 关于将 Objective C 代码添加到 swift 动态框架的澄清

    我有一个 swift 动态框架 当前正在链接到另一个用 Objective C 编写的框架 这可以工作 但很烦人 因为 Objective C 框架实际上只有 2 个文件 我想知道是否有办法将其带入我的 swift框架 如果这是我会使用的应
  • Swift 中符合协议的泛型类型

    是否可以要求泛型类型的特定实例符合 Swift 中的协议 例如 假设我有一个名为的泛型类型Thing
  • iOS 获取特定语言的字符串的本地化版本

    我正在构建一个适用于 iOS 的应用程序 该应用程序将提供英语和法语版本 我已经阅读了一些有关国际化的教程 并且了解了它的工作原理以及我需要做什么 我遇到的问题是有一个特定的情况 我想为英语用户加载法语字符串 我知道可以为整个应用程序设置语
  • 如何使用 AudioKit 音序器设置不在曲目末尾的循环?

    有没有办法在 AKSequencer 中设置具有任意开始和结束时间戳的循环 正如我所看到的 方法 setLoopInfo 只允许您设置循环的末端恰好位于轨道的末尾 但我想在曲目中间设置一个循环 我知道 AudioKit Sequencer
  • 使用仪器分配时 iOS 应用程序冻结

    当我想使用 Instruments Allocation 来分析应用程序的内存使用情况时 它在启动后立即冻结 它总是停留在启动屏幕 这是一个 Xamarin forms 应用程序 这是屏幕截图 其他信息 如果我创建一个新项目 然后使用 In
  • iOS7上UITableViewCell显示白色背景且无法修改

    我已经实现了一个继承自的自定义表格视图单元格类UITableViewCell 表格视图包含背景图像 所以我希望单元格的背景是透明的 iOS7之前看起来很棒 然而 在 iOS7 中 单元格始终显示为白色背景 即使对于 Xcode7 2015
  • GoogleMobileAds iOS 9 链接错误

    我按照以下步骤操作this https firebase google com docs admob ios quick start 由于我在安装 cocoapods 时遇到问题 我手动下载了 SDK zip 将其添加到项目中 它编译得很好
  • MFMailComposeViewController 立即关闭

    情况是 MFMailComposeViewController 将被呈现 我看到它已经完成了一半 但后来就被驳回了 这是错误 serviceViewControllerReady 错误 错误域 UIViewServiceInterfaceE
  • 如何正确设置UIView的alpha? [iOS]

    I have UIView有很多子视图 UILabel UITextView 等 如果为主视图设置 alpha 0 6 则所有子视图均采用此 alpha 如何单独设置主视图的alpha view setBackgroundColor UIC
  • [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]

    我正在使用表格视图来显示消息 我使用了下面的代码 UIView chatView self bubbleView NSString stringWithFormat message from YES self chatArray addOb
  • 在 Swift 2.0 中以横向模式使用 UIImagePickerController

    我正在编写一个仅限 LandScape 的 iPad 应用程序 我需要从库中拍照以发送数据库 但图像上传屏幕仅适用于纵向模式 如何将其更改为横向模式 我读过一些关于 UIPickerControllerDelegate 不支持横向模式的内容
  • UISearchDisplayController 显示父 UITableViewController 的标题部分

    I am facing strange issue with UITableViewController I display search result in UISearchDisplayController If I have some
  • uiscrollview 放大和缩小无法正常工作

    我有一个 uiscrollview 里面有一个 uiimageview 我希望用户能够放大图像 因为它是一个大图像 滚动视图只需要垂直滚动而不是水平滚动 在添加缩放效果之前 我有以下代码并且它按我想要的方式工作 void viewDidLo
  • 当我使用prepareForSegue将值传递给目标控制器时,存在一些问题

    首先 我使用storyboard创建两个uiviewcontroller 第一视图控制器 and 第二个视图控制器 并使用 xcode 嵌入导航控制器 into 第二个视图控制器 编辑器 gt 嵌入 gt 导航控制器 然后 我还想使用 se
  • Gmail 中删除了 iOS 深层链接

    我正在尝试发送一封带有深层链接的电子邮件到我的 iOS 应用程序 使用 myapp 格式从电子邮件中将其打开 它可以在任何 iOS 邮件客户端 邮件 邮箱等 中运行 即点击它打开应用程序 但不能在 Gmail 应用程序 甚至网络 中运行 因
  • 在后台线程上搜索

    我试图在 iPhone 应用程序中搜索数千个对象 但是搜索严重滞后 每次击键后 UI 都会冻结 1 2 秒 为了防止这种情况 我必须在后台线程上执行搜索 我想知道是否有人有一些在后台线程上搜索的提示 我读了一点NSOperation并在网上
  • xcode 错误:...此类与键 ibShadowedLargeTitleTextAttributes 的键值编码不兼容

    我不断收到此错误 在我使用颜色集之前 该应用程序就可以运行 该错误说明了一些有关ibShadowedLargeTitleTextAttributes 我没有为大标题阴影设置任何颜色 我使用默认值 透明 我重新启动了 Xcode 使用了阴影颜
  • 符号化 iPad 崩溃日志后回溯仍然不可读

    我有这些崩溃日志 在我将它们放入管理器中后 会自动进行符号化 但结果始终相同 iOS 调用得到符号化 而我的应用程序调用则没有 我尝试将 Dym 和应用程序文件复制到同一文件夹中 删除并再次复制回来 没有任何帮助 知道发生了什么事吗 所以我
  • 适用于 iOS 的 MvvmCross 汉堡菜单

    我在用着https www marcbruins nl xamarin ios hamburger menu mvvmcross https www marcbruins nl xamarin ios hamburger menu mvvm
  • 如何从TableViewCell上的自定义CollectionViewCell推送VC?

    我有一个tableView和细胞 在细胞上我有一个collectionView并在其上显示一些内容 我想发送一个有关选择的链接indexPath 我想从自定义中推送 呈现我的视图CollectionViewCell这是在TableViewC

随机推荐

  • HTML 带点尾的大文本

    如果文本大小大于应用点指示的更多文本 我想在固定大小的 div 内显示文本 example 如果 div 内可以显示的文本数量是 10 那么 文本 澳大利亚 应显示为 澳大利亚 文本 United States Of America 应显示
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 如何使我的网络应用程序兼容 iPhone 5?

    我有一个使用 iOS safari 优化为 Web 应用程序的网站 因此添加到主屏幕会在单独的 Web 视图中打开该应用程序 然而 它总是以 3 5 信箱模式打开 而不是拉伸以填充屏幕 我知道使用本机应用程序 您只需添加 iPhone 5
  • 如何修复:AttributeError:模块“neat”没有属性“config”

    我正在浏览使用发现的 NEAT 神经网络 API 玩 flappybird 的 AI 的指南 当我运行从 Github 下载的代码时 出现错误 Traceback most recent call last File test py lin
  • 构造函数中的变量?

    我目前是 Java 编程的初学者 任务是 编码并测试 Hangman 游戏的一个版本 您的解决方案将涉及一个 Hangman 类 其构造函数选择一个单词 其猜测方法处理每个猜测的字符 不过 我有一个小问题 我的整个代码可以工作并编译 并且我
  • python3.5中使用aiohttp查询获取URL的参数

    async def method request here how to get query parameters param1 request rel url query name param2 request rel url query
  • Javascript:在 For 循环中创建函数

    最近 我发现自己需要创建一系列函数 这些函数使用 XML 文档中的值 并且我使用 for 循环运行适当的节点 然而 在执行此操作时 我发现数组中的所有函数仅使用过 XML 表的最后一个节点 对应于 for 循环的最后一次运行 以下是展示这一
  • 如何确定 CSV 文件字段是制表符分隔还是逗号分隔?

    我试图确定 CSV 文件字段是制表符分隔还是逗号分隔 我需要 PHP 验证 我怎样才能确定这一点 现在回答这个问题已经太晚了 但希望它能对某人有所帮助 这是一个简单的函数 它将返回文件的分隔符 function getFileDelimit
  • JSON 响应周围的注释块

    我注意到一些 Web 应用程序返回 AJAX 响应 并在注释块中嵌入 JSON 数据 例如 这是一个示例响应 firstName John lastName Smith address streetAddress 21 2nd Street
  • 服务器端 Google 标记聚类 - Python/Django

    在尝试使用客户端方法来聚类大量 Google 标记后 我认为这对于我的项目 拥有 28 000 多名用户的社交网络 来说是不可能的 是否有在服务器端对坐标进行聚类的示例 最好是在 Python Django 中 我希望它的工作方式是根据标记
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • CPU是如何做减法的?

    我有一些基本的疑问 但每次我坐下来尝试面试问题时 这些问题和我的疑问就会出现 假设 A 5 B 2 假设A和B都是4字节 那么CPU是怎么做的呢 A B添加 我知道 A 的符号位 MSB 为 0 表示正值 B 的符号位为 1 表示负整数 现
  • 创建超过 2 组的高图表密度

    我尝试用两个以上的组创建高图表密度 我找到了一种手动将它们逐一添加的方法 但必须有更好的方法来处理组 示例 我想创建一个类似于下面的ggplot图表的highchart 而不需要将它们一一添加 有什么办法可以做到吗 d f lt data
  • 无法使用 Android 版 VLC 设置字幕

    启动 Android 版 VLC 的 VideoPlayerActivity 时 我在设置字幕位置时遇到问题 我的目标是 API 27 并使用 FileProvider 来允许访问文件 根据文档here https wiki videola
  • 从多页表单中获取活动控件名称和值

    我已经在网上寻找解决方案几个月了 但没有成功 我创建于Excel 2010 a UserForm与多页 我正在尝试编写一个函数来获取activecontrol名称和值 到目前为止 我已经成功使用此命令获取了控件的名称Me MultiPage
  • pyPDF通过django合并并显示为httpresponse

    我在合并 pyPDF 逻辑以将两个 pdf 文件合并到我的 django 站点时遇到问题 我编写了在本地服务器上的 python 文件中运行时用于合并文件的代码 但我需要明确识别要合并的文件 from pyPdf import PdfFil
  • 如何通过VBA刷新所有单元格

    有没有办法触发 从VBA Excel要求它重新评估所有Excel单元格 谢谢 The 计算 http msdn microsoft com en us library aa223802 28office 11 29 aspx方法可以重新计算
  • 最初从位图泄漏未引用的 byte[] 但被回收()导致内存泄漏(直到活动停止)

    我有位图内存泄漏导致内存不足 我在 Android 5 0 三星 S5 上运行了测试 我已经使用 Android Studio 1 5 1 2 0 0 Preview 7 调查了这个问题 HPROF 内存转储显示有多个 byte 与我暂时使
  • XTS to.weekly 返回不同的每周端点

    我有一个问题endpoints 函数于xts 还有to weekly函数 使用端点 有时返回星期五作为周末 有时返回星期一 我的数据集叫做sp2 gt head sp2 1 2012 01 09 1 78 2012 01 10 1 78 2
  • 将角半径应用于 Storyboard 内的特定 UIView 角并不适用于所有角

    我为此创建了一个自定义类 但它仅适用于左上角 不适用于其他位置 IBDesignable public class RoundedView UIView IBInspectable public var topLeft Bool false