既存のフォントに太字や斜体を設定するだけでは、Swiftが非常に複雑になることに驚いています。
フォントクラスで次のメソッドを使用することで、物事を単純化したいだけです。
Font-familyとfont-sizeが設定された既存のフォントに以下のメソッドを追加したい。これらを保存し、以下のみを変更する必要があります。
setBold:イタリック体を保持するシャッド
setItalic:太字を保持するシャッド
setBoldItalic
setNormal:ボールドとイタリックの両方を削除します
removeBold:Shudは斜体を保持します
removeitalic:太字を保持するシャッド
以下を試してみましたが、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)
}
}
_
removeItalic()
も同様です。
しかし、setNormal()
についてはわかりません。あなたはすべての特性を削除したいですか、それともイタリックとボールドを削除したいですか?多分あなたは好きなように自分でそれを行うことができます。
これらの関数はSwiftに組み込まれているはずですが、今後のバージョンで追加してほしいと思います。
これはSwiftのように太字と斜体を設定するための簡単な解決策を望んでいるすべての人のためであり、一晩中過ごしたくない私
これには次の機能があります。
isBold
isItalic
setBold:イタリックを維持する必要があります
setItalic:太字を保持する必要があります
setBoldItalic
setNormal:ボールドとイタリックの両方を削除します
desetBold:イタリックを保持する必要があります
desetItalic:太字を保持する必要があります
toggleBold
toggleItalic
extension UIFont
{
var isBold: Bool
{
return fontDescriptor().symbolicTraits.contains(.TraitBold)
}
var isItalic: Bool
{
return fontDescriptor().symbolicTraits.contains(.TraitItalic)
}
func setBoldFnc() -> UIFont
{
if(isBold)
{
return self
}
else
{
var fontAtrAry = fontDescriptor().symbolicTraits
fontAtrAry.insert([.TraitBold])
let fontAtrDetails = fontDescriptor().fontDescriptorWithSymbolicTraits(fontAtrAry)
return UIFont(descriptor: fontAtrDetails, size: 0)
}
}
func setItalicFnc()-> UIFont
{
if(isItalic)
{
return self
}
else
{
var fontAtrAry = fontDescriptor().symbolicTraits
fontAtrAry.insert([.TraitItalic])
let fontAtrDetails = fontDescriptor().fontDescriptorWithSymbolicTraits(fontAtrAry)
return UIFont(descriptor: fontAtrDetails, size: 0)
}
}
func setBoldItalicFnc()-> UIFont
{
return setBoldFnc().setItalicFnc()
}
func detBoldFnc() -> UIFont
{
if(!isBold)
{
return self
}
else
{
var fontAtrAry = fontDescriptor().symbolicTraits
fontAtrAry.remove([.TraitBold])
let fontAtrDetails = fontDescriptor().fontDescriptorWithSymbolicTraits(fontAtrAry)
return UIFont(descriptor: fontAtrDetails, size: 0)
}
}
func detItalicFnc()-> UIFont
{
if(!isItalic)
{
return self
}
else
{
var fontAtrAry = fontDescriptor().symbolicTraits
fontAtrAry.remove([.TraitItalic])
let fontAtrDetails = fontDescriptor().fontDescriptorWithSymbolicTraits(fontAtrAry)
return UIFont(descriptor: fontAtrDetails, size: 0)
}
}
func SetNormalFnc()-> UIFont
{
return detbBoldFnc().detbItalicFnc()
}
func toggleBoldFnc()-> UIFont
{
if(isBold)
{
return detbBoldFnc()
}
else
{
return setBoldFnc()
}
}
func toggleItalicFnc()-> UIFont
{
if(isItalic)
{
return detbItalicFnc()
}
else
{
return setItalicFnc()
}
}
}
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)
}
}
}
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()
}
_
INVOKE:
changeTrait(trait: .traitBold)
changeTrait(trait: .traitItalic)
私があなたを助けることができるかどうかはわかりませんが、あなたはこのようにできると思います:
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)
}
}
削除システムは必要ないと思うので作成しません。フォントを作成するときは、必要なスタイルを確立します。それだけです。私が助けてくれたことを願っています。