1

我为我的应用程序创建了一个 UIButton 子类,我需要手动将 titleLabel 重新定位为按钮高度的 1/4 左右。这个帖子; http://forums.macrumors.com/showthread.php?t=763140似乎直接解决了同样的问题,而且解决方案简单易懂。但是,我未能实现这一点,因为从未调用过我对 layoutSubviews 的覆盖。我的按钮是静态的,所以 layoutSubviews 只需要第一次调用,但它永远不会。我的代码:

@interface MyButton : UIButton {}

@implementation MyButton

- (id)initWithFrame:(CGRect)frame
{
  self = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
  [[self layer] setCornerRadius:14.0f];
  [[self layer] setBorderWidth:3.0f];
  [[self layer] setMasksToBounds:YES];
  [self setBackgroundColor:[UIColor redColor]];
  [self setFrame:frame];
  return self;
}

- (void)layoutSubviews
{
  NSLog(@"layout subs\n");
  [super layoutSubviews];
}

@end

移动标签没有问题,但永远不会调用 layoutSubviews。我也尝试添加 layoutIfNeeded,但没有任何区别。更奇怪的是,我是否尝试直接从构造函数调用 [self layoutSubviews] 但仍然没有调用layoutSubviews !我开始认为这甚至可能是 SDK 3.1.3 中的错误

谁能帮忙?!

4

2 回答 2

2
于 2014-07-10T04:24:28.680 回答
1

回答我自己的问题,看来我的子类化不正确。采用以下方法会导致 layoutSubviews 被正确调用:

+ (id)buttonWithFrame:(CGRect)frame {
  return [[[self alloc] initWithFrame:frame] autorelease];
}

- (id)initWithFrame:(CGRect)frame {
  if (self = [super initWithFrame:frame]) 
  {
    ...
    [self setFrame:frame];
  }
  return self;
}

希望能帮助别人

于 2010-09-22T11:53:16.803 回答