在自定义UIButton中手动定位titleLabel(使用layoutSubviews)

时间:2010-09-21 10:00:14

标签: iphone uibutton override subclass layoutsubviews

我为我的应用程序创建了一个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中的一个错误

任何人都可以帮忙吗?!

2 个答案:

答案 0 :(得分:2)

layoutSubviews中,您可以对子视图进行布局更改。确保方法内部:

致电[super layoutSubviews]

x 此处不要更改rect的值或self.frame。如果你这样做,它将以递归方式调用layoutSubviews

请确保只更改子视图frame

From UIView Class Reference From Apple

答案 1 :(得分: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;
}

希望能帮助他人