【问题标题】:Accessing "text styles" in Interface Builder and/or Storyboards在 Interface Builder 和/或 Storyboard 中访问“文本样式”
【发布时间】:2015-12-17 10:01:44
【问题描述】:

在我的一个应用程序中,我有一个样式文档,其中包含不同文本样式的方法,例如:

+(UIFont*)h1{
    return [UIFont fontWithName:@"Helvetica" size:48.0];
}

然后,在我的每个视图控制器的viewDidLoad 方法中,我以编程方式设置文本样式。这是保持整个应用程序样式一致且易于调整的一种非常好的方法。

这是我的问题:有没有办法让 XIB 文件/故事板反映这些文本样式?如果没有,有没有办法实现类似的功能(即,将所有样式定义在一个地方,并让 XIB/Storyboard 元素从那里拉出来)?感谢阅读。

编辑:

为了澄清,这是所需的最终结果:

  1. 在项目的某处定义一些常量文本样式,如 h1、h2、p。每种文本样式都有自己的字体、字号、颜色等。
  2. 能够在我的各种视图中将UILabels 的样式设置为这些文本样式中的任何一种。这可以在代码中、在 Interface Builder 中(例如,在 Luan 建议的用户定义的运行时属性中)或任何地方完成。
  3. 能够在 Interface Builder/Storyboard中查看应用于每个 UILabel 的样式,而无需每次都运行应用程序

【问题讨论】:

    标签: ios xcode storyboard xib


    【解决方案1】:

    好的,事实证明这是可以做到的!方法如下:

    1. 添加一个样式类,您可以将所有样式信息放在一个地方:

      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");
          }
        }
      }
      
    2. 为您想要实现样式的任何对象创建一个子类,例如 UILabel,然后输入以下代码:

      import UIKit
      
      @IBDesignable class MyLabel: UILabel {
        @IBInspectable var style:String="p"{
          didSet{self.font=MyStyle.fontForStyle(style)} 
        }
      }
      
    3. 在 Interface Builder 的视图中添加一个 UILabel,并将其类设置为 MyLabel。然后在 Attributes Inspector 中,您会看到一个 Style 字段,您可以在其中键入 h1、h2 或其他任何内容,标签的字体将立即更新。想要将所有 h1 标签更改为 48 大小?只需更新 MyStyles,您就会立即看到 XIB/Storyboards 中的变化。

    这将大大节省时间,我希望你们中的一些人也觉得它有用!

    【讨论】:

    • 当您在项目中有多个目标并且每个目标需要不同的字体样式时,此技术非常有用。只需为每个目标实现不同的MyStyles 类。
    【解决方案2】:

    我真的不明白你的意思。但是您想从 Interface Builder 设置自定义“文本样式”,您可以这样做。为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中指定文字样式

    【讨论】:

    • 这太棒了,谢谢!但是有什么方法可以直接在 IB/Storyboard 或预览窗口中查看用户定义的样式(即,每次进行更改时都无需运行应用程序)?
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多