开发者

Manual positioning of titleLabel in a custom UIButton (using layoutSubviews)

开发者 https://www.devze.com 2023-01-17 11:02 出处:网络
i\'ve create a UIButton subclass for my app and i need to manually reposition the titleLabel to be about 1/4 of the button\'s height. this post; http://forums.macrumors.com/showthread.php?t=763140 app

i've create a UIButton subclass for my app and i need to manually reposition the titleLabel to be about 1/4 of the button's height. this post; http://forums.macrumors.com/showthread.php?t=763140 appears to directly address the s开发者_高级运维ame issue, and the solution is simple and perfectly understandable. however, i have failed to implement this because my override of layoutSubviews is never called. my button is static, so layoutSubviews only need be called the first time, but it never is. my code:

@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

moving the label would be no problem, but layoutSubviews is never called. i've also tried adding layoutIfNeeded, but it made no difference. what's even weirder, is i've tried to call [self layoutSubviews] directly from the constructor but layoutSubviews is still not called!. i'm starting to think this might even be a bug in SDK 3.1.3

can anyone help?!


In layoutSubviews, you can do layout changes to your subviews. Make sure that inside the method:

Call [super layoutSubviews]

x Do not change value or rect of self.frame here. If you do so, it would recursively call layoutSubviews.

Make sure you only change frame of its subviews.

From UIView Class Reference

Manual positioning of titleLabel in a custom UIButton (using layoutSubviews)


to answer my own question, it seems i was subclassing incorrectly. taking the following approach results in layoutSubviews being called correctly:

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

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

hope that helps others

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号