UIButton с заголовком под изображением

Я хочу программно создать UIButton с заголовком под изображением.

Размер кнопки: 170*120 Размер изображения: 50*50 Размер заголовка: зависит от текста.

Я знаю, что должен использовать, но я не знаю, как:

[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, 0.f, 0.f)];
[_button setImageEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, 0.f, 0.f)];

Я думаю, что я должен рассчитать размер заголовка, а затем использовать EdgeInsets.

Спасибо.


person Alak    schedule 07.10.2012    source источник


Ответы (2)


Окончательное и стабильное решение - использовать фрейм, а не EdgeInset решение, подобное этому:

@interface UIButton (UIButtonExt)
(void)centerImageAndTitleEx;
@end

@implementation UIButton (UIButtonExt)

(void)centerImageAndTitleEx
{
CGRect frame = self.imageView.frame;

frame = CGRectMake(truncf((self.bounds.size.width - frame.size.width) / 2), 10.0f, frame.size.width, frame.size.height);

self.imageView.frame = frame;

frame = self.titleLabel.frame;

frame = CGRectMake(truncf((self.bounds.size.width - frame.size.width) / 2), self.bounds.size.height - frame.size.height - 5.0, frame.size.width, frame.size.height);

self.titleLabel.frame = frame;
}

@end
person ناصر عبده عبده مح    schedule 04.01.2016
comment
Кажется, что если текст заголовка слишком длинный, он обрезается посередине, даже если во фрейме UIButton есть место для его отображения. Каждый раз, когда я пытался увеличить ширину рамки заголовка, заголовок возвращался к самому изображению. Есть идеи? - person Ben; 19.04.2017

Надеюсь, это поможет вам.

@interface UIButton (UIButtonExt)  

- (void)centerImageAndTitle:(float)space;  
- (void)centerImageAndTitle;  

@end  

@implementation UIButton (UIButtonExt)  

- (void)centerImageAndTitle:(float)spacing  
{      
    // get the size of the elements here for readability  
    CGSize imageSize = self.imageView.frame.size;  
    CGSize titleSize = self.titleLabel.frame.size;  

    // get the height they will take up as a unit  
    CGFloat totalHeight = (imageSize.height + titleSize.height + spacing);  

    // raise the image and push it right to center it  
    self.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight - imageSize.height), 0.0, 0.0, - titleSize.width);  

    // lower the text and push it left to center it  
    self.titleEdgeInsets = UIEdgeInsetsMake(0.0, - imageSize.width, - (totalHeight - titleSize.height),0.0);      
}  

- (void)centerImageAndTitle  
{  
    const int DEFAULT_SPACING = 6.0f;  
    [self centerImageAndTitle:DEFAULT_SPACING];  
}  

@end   
person uspython    schedule 07.10.2012
comment
Это очень хороший ответ! Но у меня были некоторые проблемы, и изменение того, как вы определяете titleSize, решило это: CGSize titleSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font constrainedToSize:CGSizeMake(self.frame.size.width, MAXFLOAT) lineBreakMode:self.titleLabel.lineBreakMode]; - person Natan R.; 19.03.2013
comment
@NatanR., поскольку sizeWithFont сейчас устарел, его можно использовать для поддержки iOS7+ CGSize titleSize = [self.titleLabel.text sizeWithAttributes: @{NSFontAttributeName:self.titleLabel.font}]; от @chadkouse - person Hemang; 04.10.2014
comment
есть ли способ сделать это в раскадровке? - person Dashrath; 17.12.2015