代码之家  ›  专栏  ›  技术社区  ›  OrangeDog

为什么UIPageViewController的转换会改变字体?

  •  3
  • OrangeDog  · 技术社区  · 9 年前

    我有一个应用程序,它使用UIPageViewController在首次启动时提供快速指南。 UI构建在一个故事板中——每个页面都有相同的笔尖和VC,但文本会发生变化。 UILabels在Storyboard中设置了自定义字体(GothamRounded Book),可在预览中正确显示。 但是,在设备上运行时,它们始终显示为系统字体。

    经过一些调查后,我向标签的字体属性添加了一个观察者,它在第一次出现时以及每当页面发生变化时都会发生变化(水平滚动)。下面是日志记录和堆栈跟踪。

    为什么?我怎样才能阻止它?

    viewDidLoad: <UICTFont: 0x14783630> font-family: \"GothamRounded-Book\"; font-weight: normal; font-style: normal; font-size: 17.00pt
    
    viewDidAppear: <UICTFont: 0x14783630> font-family: \"GothamRounded-Book\"; font-weight: normal; font-style: normal; font-size: 17.00pt
    
    change: {
        kind = 1;
        new = "<UICTFont: 0x1478ab40> font-family: \".HelveticaNeueInterface-Regular\"; font-weight: normal; font-style: normal; font-size: 14.00pt";
        old = "<UICTFont: 0x14783630> font-family: \"GothamRounded-Book\"; font-weight: normal; font-style: normal; font-size: 17.00pt";
    }
    
    frame #1: 0x2b2d8eba Foundation`NSKeyValueNotifyObserver + 262
    ...
    frame #6: 0x2b2f834e Foundation`-[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 310
    frame #7: 0x2e053d20 UIKit`-[_UIAttributeTraitStorage applyRecordsMatchingTraitCollection:] + 296
    frame #8: 0x2e053518 UIKit`-[NSObject(_UITraitStorageAccessors) _applyTraitStorageRecordsForTraitCollection:] + 164
    frame #9: 0x2df6ade2 UIKit`-[UIView _traitCollectionDidChangeFromOldCollection:toNewCollection:scaleDidChange:] + 58
    frame #10: 0x2df6aea0 UIKit`-[UIView _wrappedProcessDidChangeRecursivelyFromOldTraits:toCurrentTraits:scaleDidChange:forceNotification:] + 128
    frame #11: 0x2df6b0a0 UIKit`__86-[UIView _processDidChangeRecursivelyFromOldTraits:toCurrentTraits:forceNotification:]_block_invoke + 44
    frame #12: 0x2e2fe830 UIKit`-[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 120
    frame #13: 0x2df6b068 UIKit`-[UIView _processDidChangeRecursivelyFromOldTraits:toCurrentTraits:forceNotification:] + 252
    frame #14: 0x2dccafae UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 510
    frame #15: 0x2d6ded28 QuartzCore`-[CALayer layoutSublayers] + 128
    frame #16: 0x2d6da55c QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 360
    frame #17: 0x2d6da3e4 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
    frame #18: 0x2d6d9d80 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 224
    frame #19: 0x2d6d9b6e QuartzCore`CA::Transaction::commit() + 434
    frame #20: 0x2d6d3848 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 56
    frame #21: 0x2a616fec CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
    ...
    frame #28: 0x000fc840 MyApp`main(argc=1, argv=0x014a2a74) + 108 at main.m:14
    

    Label properties

    1 回复  |  直到 9 年前
        1
  •  3
  •   OrangeDog    9 年前

    为什么?

    字体自动调整不适用于自定义字体,这包括使用大小类或自动缩小设置。如果不使用大小类,则自动收缩无效。如果使用大小类,自动缩小将始终处于活动状态,并将字体重置为系统字体。我已经测试了Xcode 6.4和Xcode 7b3。

    我怎样才能阻止它?

    如果使用任何动态字体大小,则仅在情节提要中使用系统字体。 推翻 viewDidLayoutSubviews 设置实际需要的字体。如果自定义字体的大小属性与系统字体的大小显著不同,则需要对计算的大小进行更正。

    - (void)viewDidLayoutSubviews {
        self.myLabel.font = [UIFont fontWithName:@"Custom" size:self.myLabel.font.pointSize];
    }