Ios Swift使字体切换为粗体、斜体、粗体斜体、普通,而不更改其他属性
我很惊讶,在Swift中,仅仅为现有字体设置粗体和斜体是如此复杂 我只想通过在font类上使用以下方法来简化事情 我想下面的方法被添加到现有的字体有字体系列和字体大小设置。我需要保留这些,并只更改以下内容 setBold:Shud保留斜体 setItalic:Shud保留粗体 缩进斜体 setNormal:删除粗体和斜体 removeBold:Shud保留斜体 removeitalic:Shud-preserve-bold 我尝试了下面的方法,使用fontDescriptorWithSymbolicTraits对我来说就像一场噩梦 有没有一种更简单的方法可以在几行代码中实现这些功能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
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)
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)
}
}