Ios Swift使字体切换为粗体、斜体、粗体斜体、普通,而不更改其他属性

Ios Swift使字体切换为粗体、斜体、粗体斜体、普通,而不更改其他属性,ios,swift,uifont,bold,italic,Ios,Swift,Uifont,Bold,Italic,我很惊讶,在Swift中,仅仅为现有字体设置粗体和斜体是如此复杂 我只想通过在font类上使用以下方法来简化事情 我想下面的方法被添加到现有的字体有字体系列和字体大小设置。我需要保留这些,并只更改以下内容 setBold:Shud保留斜体 setItalic:Shud保留粗体 缩进斜体 setNormal:删除粗体和斜体 removeBold:Shud保留斜体 removeitalic:Shud-preserve-bold 我尝试了下面的方法,使用fontDescriptorWithSymbol

我很惊讶,在Swift中,仅仅为现有字体设置粗体和斜体是如此复杂

我只想通过在font类上使用以下方法来简化事情

我想下面的方法被添加到现有的字体有字体系列和字体大小设置。我需要保留这些,并只更改以下内容

setBold:Shud保留斜体

setItalic:Shud保留粗体

缩进斜体

setNormal:删除粗体和斜体

removeBold:Shud保留斜体

removeitalic:Shud-preserve-bold

我尝试了下面的方法,使用fontDescriptorWithSymbolicTraits对我来说就像一场噩梦

有没有一种更简单的方法可以在几行代码中实现这些功能

extension UIFont
{
    var isBold: Bool
    {
        return fontDescriptor().symbolicTraits.contains(.TraitBold)
    }

    var isItalic: Bool
    {
        return fontDescriptor().symbolicTraits.contains(.TraitItalic)
    }

    func setBold() -> UIFont
    {
        var fontDescriptorVar: UIFontDescriptor
        if(isBold){
            return self
        }
        else
        {
            fontDescriptorVar = fontDescriptor().fontDescriptorWithSymbolicTraits(.TraitBold)
        }
        return UIFont(descriptor: fontDescriptorVar, size: 0)
    }

    func setItalic()-> UIFont
    {
        var fontDescriptorVar: UIFontDescriptor
        if(isItalic) {
            return self
        }
        else
        {
            fontDescriptorVar = fontDescriptor().fontDescriptorWithSymbolicTraits(.TraitItalic)
        }
        return UIFont(descriptor: fontDescriptorVar, size: 0)
    }

    func setBoldItalic()-> UIFont
    {
        let fontDescriptorVar = fontDescriptor().fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits(arrayLiteral: .TraitBold, .TraitItalic))
        return UIFont(descriptor: fontDescriptorVar, size: 0)
    }

    // Things I need are

    // To set back to normal

    func setNormal()-> UIFont
    {

    }

    // Remove only bold if it's both bold and Italic

    func removeBold()-> UIFont
    {

    }

    // Remove only italic if it's both bold and Italic

    func removeitalic()-> UIFont
    {

    }
}
我不想使用这个要求我输入大小和字体的选项:

UIFont(name "namFontFamily", size: 16)

UIFont.systemFontOfSize(16, weight: UIFontWeightLight)

我到处搜索,没有找到符合我需要的简单解决方案。

你说你想保留其他特性,所以你可能需要修改代码中的一些方法:

func setBold() -> UIFont
{
    if isBold {
        return self
    } else {
        var symTraits = fontDescriptor().symbolicTraits
        symTraits.insert([.TraitBold])
        let fontDescriptorVar = fontDescriptor().fontDescriptorWithSymbolicTraits(symTraits)
        return UIFont(descriptor: fontDescriptorVar, size: 0)
    }
}
setItalic()
setBoldItalic()
也是如此

因此,
removeBold()
应该是这样的:

func removeBold()-> UIFont
{
    if !isBold {
        return self
    } else {
        var symTraits = fontDescriptor().symbolicTraits
        symTraits.remove([.TraitBold])
        let fontDescriptorVar = fontDescriptor().fontDescriptorWithSymbolicTraits(symTraits)
        return UIFont(descriptor: fontDescriptorVar, size: 0)
    }
}
removetalic()
类似


但是我不确定
setNormal()
。你想删除所有特征,还是只删除斜体和粗体?也许你可以自己做。

这些函数应该内置在Swift中,但我希望它们能在即将发布的版本中添加它们。

这是为所有谁想要一个简单的解决方案设置粗体和斜体。。。等在斯威夫特和不想花整个晚上像我一样

这有以下特点:

伊斯波尔德

伊斯兰的

挫折:应该保留斜体

setItalic:应保留粗体

缩进斜体

setNormal:删除粗体和斜体

desetBold:应该保留斜体

德塞蒂塔利克:应该保留粗体

托格博尔德

切换斜体


SWIFT 3.1

func changeTrait(trait: UIFontDescriptorSymbolicTraits) {
        let range = textView.selectedRange
        let currentAttributes = textView.textStorage.attributes(at: range.location, effectiveRange: nil)
        guard let currentFont = currentAttributes[NSFontAttributeName] as? UIFont else {
            return
        }

        let fontDescriptor = currentFont.fontDescriptor
        var changedFontDescriptor: UIFontDescriptor!


        if fontDescriptor.symbolicTraits.contains(trait) {
            let existingTraitsWithNewTrait = UIFontDescriptorSymbolicTraits(rawValue: fontDescriptor.symbolicTraits.rawValue & ~trait.rawValue)
            changedFontDescriptor = fontDescriptor.withSymbolicTraits(existingTraitsWithNewTrait)
        } else {
            changedFontDescriptor = fontDescriptor.withSymbolicTraits(UIFontDescriptorSymbolicTraits(rawValue: fontDescriptor.symbolicTraits.rawValue | trait.rawValue))
        }

        let updatedFont = UIFont(descriptor: changedFontDescriptor , size: 0)

        let newAttributes = [NSFontAttributeName: updatedFont]
        textView.textStorage.beginEditing()
        textView.textStorage.setAttributes(newAttributes, range: range)
        textView.textStorage.endEditing()
 }
调用:

  • 对于粗体:
    更改特征(特征:.traitBold)
  • 斜体:
    更改特征(特征:.tratitalic)
  • Swift 3.1

    extension UIFont{
    var isBold: Bool
    {
        return fontDescriptor.symbolicTraits.contains(.traitBold)
    }
    
    var isItalic: Bool
    {
        return fontDescriptor.symbolicTraits.contains(.traitItalic)
    }
    
    func setBold() -> UIFont
    {
        if(isBold)
        {
            return self
        }
        else
        {
            var fontAtrAry = fontDescriptor.symbolicTraits
            fontAtrAry.insert([.traitBold])
            let fontAtrDetails = fontDescriptor.withSymbolicTraits(fontAtrAry)
            return UIFont(descriptor: fontAtrDetails!, size: pointSize)
        }
    }
    
    func setItalic()-> UIFont
    {
        if(isItalic)
        {
            return self
        }
        else
        {
            var fontAtrAry = fontDescriptor.symbolicTraits
            fontAtrAry.insert([.traitItalic])
            let fontAtrDetails = fontDescriptor.withSymbolicTraits(fontAtrAry)
            return UIFont(descriptor: fontAtrDetails!, size: pointSize)
        }
    }
    func desetBold() -> UIFont
    {
        if(!isBold)
        {
            return self
        }
        else
        {
            var fontAtrAry = fontDescriptor.symbolicTraits
            fontAtrAry.remove([.traitBold])
            let fontAtrDetails = fontDescriptor.withSymbolicTraits(fontAtrAry)
            return UIFont(descriptor: fontAtrDetails!, size: pointSize)
        }
    }
    
    func desetItalic()-> UIFont
    {
        if(!isItalic)
        {
            return self
        }
        else
        {
            var fontAtrAry = fontDescriptor.symbolicTraits
            fontAtrAry.remove([.traitItalic])
            let fontAtrDetails = fontDescriptor.withSymbolicTraits(fontAtrAry)
            return UIFont(descriptor: fontAtrDetails!, size: pointSize)
        }
    }
    }
    

    我不知道我是否能帮助你,但我认为你可以这样做:

    extension UIFont {
    
        public static func CreateWithStyle(name: String, size: CGFloat, styles: [UIFontDescriptor.SymbolicTraits]) -> UIFont {
    
            let fontDescriptor = UIFontDescriptor(name: name, size: size)
            var fontAtrAry = fontDescriptor.symbolicTraits
    
            if styles.count > 0 {
    
                for style in styles {
                    fontAtrAry.update(with: style)
                }
            }
    
            return UIFont(descriptor: fontDescriptor.withSymbolicTraits(fontAtrAry)!, size: size)
        }
    }
    
    我不创建删除系统,因为我认为我们不需要它。 当我们创建字体时,我们建立我们想要的样式,就是这样。
    希望我能帮上忙。

    另一种方法是检查粗体和斜体按钮的选择

    粗体字:

    @IBAction func bold(_ sender : UIButton){
        sender.isSelected = !sender.isSelected
        if sender.isSelected{
            self.textView.font = self.textView.font?.bold()
        }else{
            self.textView.font = self.textView.font?.removeBold()
        }
    }
    
    斜体:

    @IBAction func italic(_ sender : UIButton){
        sender.isSelected = !sender.isSelected
        if sender.isSelected{
            self.textView.font = self.textView.font?.italic()
        }else{
            self.textView.font = self.textView.font?.removeItalic()
        }
    }
    
    然后UIFont扩展可以保存添加和删除特征的不同方法

    在withTraits方法中添加新特征时,请确保保留以前的特征

    extension UIFont {
    
    //Add Traits
    func withTraits(traits:UIFontDescriptor.SymbolicTraits) -> UIFont {
        let symTraits = fontDescriptor.symbolicTraits
        let descriptor = fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits(arrayLiteral: symTraits, traits))
        return UIFont(descriptor: descriptor!, size: 0) //size 0 means keep the size as it is
    }
    
    func bold() -> UIFont {
        return withTraits(traits: .traitBold)
    }
    
    func italic() -> UIFont {
        return withTraits(traits: .traitItalic)
    }
    
    //remove traits
    func withoutTraits(traits:UIFontDescriptor.SymbolicTraits) -> UIFont {
        var symTraits = fontDescriptor.symbolicTraits
        symTraits.remove([traits])
        let fontDescriptorVar = fontDescriptor.withSymbolicTraits(symTraits)
        return UIFont(descriptor: fontDescriptorVar!, size: 0)
    }
    
    func removeBold() -> UIFont {
        return withoutTraits(traits: .traitBold)
    }
    
    func removeItalic() -> UIFont {
        return withoutTraits(traits: .traitItalic)
    }
    
    }
    

    我认为检查字体系列非常重要,因为并非所有字体都有粗体和斜体,您是使用默认字体还是添加了新字体?我有自己的粗体和斜体字体系列列表。此外,字体也有文本颜色。大多数字体都有“粗体”或“斜体”后缀,因此如果您的字体名称与此模式匹配,您可能会根据它们的名称构造字体。我的方法应该与字体系列无关,应该像css中一样粗体。因为它试图创造一个通用的一个所有时间使用这是我一直在寻找,谢谢。你真的救了我的命:-)@ReimondHill,请解释一下你不工作。就我用Xcode 10和iPhone sim 12.0测试代码而言,我为Swift 4.2翻译的代码工作正常。
    extension UIFont {
    
    //Add Traits
    func withTraits(traits:UIFontDescriptor.SymbolicTraits) -> UIFont {
        let symTraits = fontDescriptor.symbolicTraits
        let descriptor = fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits(arrayLiteral: symTraits, traits))
        return UIFont(descriptor: descriptor!, size: 0) //size 0 means keep the size as it is
    }
    
    func bold() -> UIFont {
        return withTraits(traits: .traitBold)
    }
    
    func italic() -> UIFont {
        return withTraits(traits: .traitItalic)
    }
    
    //remove traits
    func withoutTraits(traits:UIFontDescriptor.SymbolicTraits) -> UIFont {
        var symTraits = fontDescriptor.symbolicTraits
        symTraits.remove([traits])
        let fontDescriptorVar = fontDescriptor.withSymbolicTraits(symTraits)
        return UIFont(descriptor: fontDescriptorVar!, size: 0)
    }
    
    func removeBold() -> UIFont {
        return withoutTraits(traits: .traitBold)
    }
    
    func removeItalic() -> UIFont {
        return withoutTraits(traits: .traitItalic)
    }
    
    }