iOS 8 自定义标签 LayoutSubviews 方法永远不会被调用?

Posted

技术标签:

【中文标题】iOS 8 自定义标签 LayoutSubviews 方法永远不会被调用?【英文标题】:iOS 8 Custom label LayoutSubviews method never get called? 【发布时间】:2014-09-26 21:07:26 【问题描述】:

XCODE 6.0.1,ios 8,自定义 UILabel,方法:LayoutSubviews

我有自定义的 UILabel,它在 iOS6 和 iOS7 上运行良好。但是在 iOS 8 上,这个标签的 -(void)layoutSubviews 方法永远不会被调用。在这里我想添加该标签是我的故事板场景的一部分,它是在以前的 Xcode 版本中创建的。

iOS 8 中的自动布局系统会发生什么?视图布局是否有重大变化?

感谢任何帮助。

谢谢。

【问题讨论】:

似乎问题已在 iOS 8.1 beta 版本中得到修复。 【参考方案1】:

查看此问题的答案:Xcode6, iOS8 and (void)layoutSubviews

实际上,iOS8 上的 UILabel 不再调用 layoutSubviews,因为 Apple 不希望有人将其用作超级视图。

我使用的是 ReactiveCocoaLayout,所以可以通过订阅 rcl_frameSignal 或 rcl_boundsSignal 来完成。

-(void)awakeFromNib  [ self.rcl_boundsSignal subscribeNext: ^( NSValue* boundsValue )  //layout changed  ]; 
Or you can use simple KVO to know when frame has been changed:
-(void)dealloc

   [ self removeObserver: self forKeyPath: @"layer.bounds" ];


-(void)observeValueForKeyPath:( NSString* )keyPath
                     ofObject:( id )object
                       change:( NSDictionary* )change
                      context:( void* )context

   if ( [ keyPath isEqualToString: @"layer.bounds" ] )
   
      //layoutSubviews
   
   else
   
      [ super observeValueForKeyPath: keyPath
                      ofObject: object
                        change: change
                       context: context ];
   


-(void)awakeFromNib

   [ self addObserver: self
           forKeyPath: @"layer.bounds"
              options: NSKeyValueObservingOptionNew
              context: 0 ];

【讨论】:

以上是关于iOS 8 自定义标签 LayoutSubviews 方法永远不会被调用?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 自定义标签栏项目比标签栏高

如何在 iOS 中管理自定义单元格标签值?

iOS 自定义视图文本标签为零

iOS:为啥自定义标签栏项目仅显示为灰色轮廓?

Xamarin 表单:UWP 和 Windows 8.1 中的自定义字体

iOS 标签栏项自定义图像