Как использовать contentStretch UIView - PullRequest
1 голос
/ 30 марта 2011

Я хочу использовать изображение размером 27x27 с растягиванием по центру на 1 пиксель в качестве backgroundImage кнопки UIB. Вот мой код:

[button setBackgroundImage:[UIImage imageNamed:@"button_image"] forState:UIControlStateNormal];
button.frame = CGRectMake(0.f, 0.f, 27.f, 27.f);
button.contentStretch = CGRectMake(13.f/27.f, 13.f/27.f, 1.f/27.f, 1.f/27.f);
[button setTitle:NSLocalizedString(@"long title", @"long title") forState:UIControlStateNormal];
[button sizeToFit];
CGRect buttonFrame = button.frame;
buttonFrame.size.width += 18.f * 2;
button.frame = buttonFrame;

Но результат ничем не отличается от этого без установки contentStretch.

Итак, как правильно использовать contentStretch для достижения того, чего я хочу?

Пожалуйста, не говорите мне снова и снова, что я могу достичь того же эффекта с stretchableImageWithLeftCapWidth:topCapHeight:. Я знаю это, и это, очевидно, не то, что я прошу. Я просто хочу знать, как правильно использовать contentStretch. Спасибо.

Ответы [ 4 ]

1 голос
/ 07 августа 2011

Неудовлетворительный, но простой ответ:

Вы не можете, пока Apple не исправит это. IMO, это долго выдающаяся и очень раздражающая ошибка.

Реализация UIButton состоит из пары подпредставлений, и (внутреннее) фоновое представление, по-видимому, не отражает настройки, выполненные в представлении UIButton.

1 голос
/ 30 апреля 2011

Я не знаю особого поведения с кнопками UIB (я бы также предложил использовать там растягиваемые изображения, так как это составное представление).Однако, если вы хотите использовать contentStretch, вы можете сделать это на UIView, учитывая ваши данные:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)];
view.layer.contents = (id)[[UIImage imageNamed:@"button_image"] CGImage];
view.contentStretch = CGRectMake(13./27., 13./27., 1./27., 1./27.);

Этого должно быть достаточно, чтобы иметь UIView с растягиваемым фоном.

1 голос
/ 06 мая 2011

Использование -[UIImage stretchableImageWithLeftCapWidth:topCapHeight:].

Я поместил это в метод init подкласса UIView:

// Add errorBackground & errorLabel.
rect.size.height = 26.0f;
errorBackground = [[UIImageView alloc] initWithFrame:rect];
errorBackground.image = [[UIImage imageNamed:@"ErrorBubble.png"]
                         stretchableImageWithLeftCapWidth:13 topCapHeight:0];
UILabel *errorLabel = [[UILabel alloc] initWithFrame:
                       CGRectMake(0.0f, 0.0f, rect.size.width, rect.size.height)];
errorLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
errorLabel.backgroundColor = [UIColor clearColor];
errorLabel.textAlignment = UITextAlignmentCenter;
errorLabel.font = [UIFont systemFontOfSize:14.0f];
errorLabel.text = @"1 Failed Passcode Attempt";
errorLabel.textColor = [UIColor whiteColor];
errorLabel.shadowColor = [UIColor blackColor];
errorLabel.shadowOffset = CGSizeMake(0.0f, -1.0f);
[errorBackground addSubview:errorLabel];
[errorLabel release];
[self addSubview:errorBackground];

ErrorBubble.png: ErrorBubble.png

ErrorBubble@2x.png: ErrorBubble@2x.png

1 голос
/ 23 апреля 2011

Одна проблема, которую я вижу, это то, что вы делите, используя целочисленное деление.1/27 равно 0. 1.0 / 27.0 равно 0.037 ...

Если все, что вам нужно, это растягиваемый фон на кнопке, проверьте stretchableImageWithLeftCapWidth: topCapHeight: on UIImage.Создайте растягиваемое изображение таким образом, а затем установите его на фон своей кнопки.

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