2012-10-07 4 views
4

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

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

Я знаю I'have использовать, но я не знаю, как:

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

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

спасибо.

ответ

4

Конечной и стабильным решением является использование кадра, не 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 
+0

Кажется, что если текст заголовка слишком длинный, он обрезает его посередине, даже если в кадре UIButton есть место для его отображения. Каждый раз, когда я пытался расходовать ширину рамки заголовка, название возвращается к самому изображению. Есть идеи? – Ben

19

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

@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 
+2

Это очень хороший ответ! Но у меня были некоторые проблемы и изменение того, как вы определили titleSize, решив его: 'CGSize titleSize = [self.titleLabel.text sizeWithFont: self.titleLabel.font constrainedToSize: CGSizeMake (self.frame.size.width, MAXFLOAT) lineBreakMode: self.titleLabel .lineBreakMode]; ' –

+2

@NatanR., поскольку sizeWithFont теперь устарел, можно использовать это для поддержки iOS7 + ' CGSize titleSize = [self.titleLabel.text sizeWithAttributes: @ {NSFontAttributeName: self.titleLabel.font}]; ' by @ [chadkouse] (https://gist.github.com/chadkouse) – Hemang

+0

есть ли способ сделать это в раскадровке? – Dashrath

 Смежные вопросы

  • Нет связанных вопросов^_^