Ручное позиционирование titleLabel в пользовательской кнопке UIB (с использованием layoutSubviews) - PullRequest
1 голос
/ 21 сентября 2010

Я создал подкласс 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 ]

2 голосов
/ 10 июля 2014

В layoutSubviews вы можете вносить изменения в макет своих подпредставлений. Убедитесь, что внутри метода:

Звоните [super layoutSubviews]

x Не изменяйте значение или rect из self.frame здесь. Если вы сделаете это, он будет рекурсивно вызывать layoutSubviews.

Убедитесь, что вы изменили только frame его подпредставлений .

Из справочника классов UIView From Apple

1 голос
/ 22 сентября 2010

чтобы ответить на мой собственный вопрос, кажется, я неправильно подклассифицировал. следующий подход приводит к правильному вызову 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;
}

надеюсь, что помогает другим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...