在 Interface Builder and/or 故事板中访问 "text styles"
Accessing "text styles" in Interface Builder and/or Storyboards
在我的一个应用程序中,我有一个样式文档,其中包含用于不同文本样式的方法,例如:
+(UIFont*)h1{
return [UIFont fontWithName:@"Helvetica" size:48.0];
}
然后,在每个视图控制器的 viewDidLoad
方法中,我以编程方式设置文本样式。这是使整个应用程序的样式保持一致且易于调整的非常好的方法。
这是我的问题:有什么方法可以让 XIB files/Storyboards 反映这些文本样式?如果没有,是否有任何方法可以实现类似的功能(即,将所有样式定义在一个地方,并从那里提取 XIB/Storyboard 元素)?感谢阅读。
编辑:
澄清一下,这是期望的最终结果:
- 在项目的某处定义一些常量文本样式,如h1、h2、p。每种文本样式都有自己的字体、字体大小、颜色等。
- 能够在我的各种视图中将
UILabels
的样式设置为这些文本样式中的任何一种。这可以在代码中、在 Interface Builder 中(例如,在 Luan 建议的用户定义的运行时属性中)或任何地方完成。
- 能够在 Interface Builder/Storyboard 中查看应用于每个 UILabel 的样式而无需每次都运行 应用程序。
我不太明白你的意思。但是你想从 Interface Builder 中设置自定义 "text style" 你可以这样做。对于 UILable
1、创建类别UILabel + MyCustomStyle.
在UILabel + MyCustomStyle.h
#import <UIKit/UIKit.h>
@interface UILabel (MyCustomStyle)
@property (nonatomic, copy) NSString *mTextStyle;
@end
在UILabel + MyCustomStyle.m
#import "UILabel+MyCustomStyle.h"
@implementation UILabel (MyCustomStyle)
-(NSString *)mTextStyle {
return self.text;
}
-(void)setMTextStyle:(NSString *)txt{
if ([txt isEqualToString:@"h1"]) {
// custom style h1 code
self.font = ...;
}else if ([txt isEqualToString:@"h2"]){
// custom style h2 code
self.font = ...;
}
//... more custom style
}
2、在IB中指定文字样式
好的,事实证明这是可以做到的!方法如下:
添加样式 class,您可以将所有样式信息放在一个地方:
import UIKit
class MyStyles: NSObject {
static func fontForStyle(style:String)->UIFont{
switch style{
case "p":
return UIFont.systemFontOfSize(18);
case "h1":
return UIFont.boldSystemFontOfSize(36);
case "h2":
return UIFont.boldSystemFontOfSize(24);
default:
return MyStyle.fontForStyle("p");
}
}
}
为您想要实现样式的任何对象创建子class,比如 UILabel,然后输入以下代码:
import UIKit
@IBDesignable class MyLabel: UILabel {
@IBInspectable var style:String="p"{
didSet{self.font=MyStyle.fontForStyle(style)}
}
}
- 将 UILabel 添加到 Interface Builder 中的视图并将其 class 设置为 MyLabel。然后在 Attributes Inspector 中,您会看到一个 Style 字段,您可以在其中键入 h1、h2 或其他任何内容,标签的字体将立即更新。想要将所有 h1 标签的大小更改为 48?只需更新 MyStyles,您就会立即在 XIBs/Storyboards 中看到更改。
这将大大节省时间,我希望你们中的一些人也觉得它有用!
在我的一个应用程序中,我有一个样式文档,其中包含用于不同文本样式的方法,例如:
+(UIFont*)h1{
return [UIFont fontWithName:@"Helvetica" size:48.0];
}
然后,在每个视图控制器的 viewDidLoad
方法中,我以编程方式设置文本样式。这是使整个应用程序的样式保持一致且易于调整的非常好的方法。
这是我的问题:有什么方法可以让 XIB files/Storyboards 反映这些文本样式?如果没有,是否有任何方法可以实现类似的功能(即,将所有样式定义在一个地方,并从那里提取 XIB/Storyboard 元素)?感谢阅读。
编辑:
澄清一下,这是期望的最终结果:
- 在项目的某处定义一些常量文本样式,如h1、h2、p。每种文本样式都有自己的字体、字体大小、颜色等。
- 能够在我的各种视图中将
UILabels
的样式设置为这些文本样式中的任何一种。这可以在代码中、在 Interface Builder 中(例如,在 Luan 建议的用户定义的运行时属性中)或任何地方完成。 - 能够在 Interface Builder/Storyboard 中查看应用于每个 UILabel 的样式而无需每次都运行 应用程序。
我不太明白你的意思。但是你想从 Interface Builder 中设置自定义 "text style" 你可以这样做。对于 UILable
1、创建类别UILabel + MyCustomStyle.
在UILabel + MyCustomStyle.h
#import <UIKit/UIKit.h>
@interface UILabel (MyCustomStyle)
@property (nonatomic, copy) NSString *mTextStyle;
@end
在UILabel + MyCustomStyle.m
#import "UILabel+MyCustomStyle.h"
@implementation UILabel (MyCustomStyle)
-(NSString *)mTextStyle {
return self.text;
}
-(void)setMTextStyle:(NSString *)txt{
if ([txt isEqualToString:@"h1"]) {
// custom style h1 code
self.font = ...;
}else if ([txt isEqualToString:@"h2"]){
// custom style h2 code
self.font = ...;
}
//... more custom style
}
2、在IB中指定文字样式
好的,事实证明这是可以做到的!方法如下:
添加样式 class,您可以将所有样式信息放在一个地方:
import UIKit class MyStyles: NSObject { static func fontForStyle(style:String)->UIFont{ switch style{ case "p": return UIFont.systemFontOfSize(18); case "h1": return UIFont.boldSystemFontOfSize(36); case "h2": return UIFont.boldSystemFontOfSize(24); default: return MyStyle.fontForStyle("p"); } } }
为您想要实现样式的任何对象创建子class,比如 UILabel,然后输入以下代码:
import UIKit @IBDesignable class MyLabel: UILabel { @IBInspectable var style:String="p"{ didSet{self.font=MyStyle.fontForStyle(style)} } }
- 将 UILabel 添加到 Interface Builder 中的视图并将其 class 设置为 MyLabel。然后在 Attributes Inspector 中,您会看到一个 Style 字段,您可以在其中键入 h1、h2 或其他任何内容,标签的字体将立即更新。想要将所有 h1 标签的大小更改为 48?只需更新 MyStyles,您就会立即在 XIBs/Storyboards 中看到更改。
这将大大节省时间,我希望你们中的一些人也觉得它有用!