iPhone SDK: UIButton с возможным изображением и текстом?


У меня есть кнопка размера ширина 200 и высота 270. Я хочу иметь текст и изображение на одной кнопке. Не как фоновое изображение на этом тексте. Вместо этого я хочу отобразить текст с высотой 120 и изображение высоты 150 на той же кнопке. У кого-нибудь есть идеи? Пожалуйста, дайте мне знать, если вы не поняли мой вопрос.

8 63

8 ответов:

вы можете использовать этот код,он будет служить вашей цели

.h file code
IBOutlet UIButton *testBtn;

.m file code
[testBtn setImage: [UIImage imageNamed:@"Image name.png"] forState:UIControlStateNormal];
[testBtn setTitleEdgeInsets:UIEdgeInsetsMake(70.0, -150.0, 5.0, 5.0)];
[testBtn setTitle:@"Your text" forState:UIControlStateNormal];

изменить координаты и размер вашей кнопки как ваше требование.Это пример кода, который поможет вам.

PS: возьмите UIButton в файле nib>сделайте его пользовательской кнопкой>подключите IBOutlet к своей пользовательской кнопке в файле nib.Вот и все.

в приведенном ниже коде показано размещение изображения и текста в кнопке с использованием свойств setImageEdgeInsets и setTitleEdgeInsets класса UIButton.

UIButton *butt=[UIButton buttonWithType:UIButtonTypeCustom ];
    [butt setFrame:CGRectMake(0, 0, 100, 100)];
    [butt setBackgroundImage:[UIImage imageNamed:@"sig.png"] forState:UIControlStateNormal];
    [butt setImageEdgeInsets:UIEdgeInsetsMake(0.0, 0.0, 50.0, 0.0)];
    [butt setTitleEdgeInsets:UIEdgeInsetsMake(75.0, 0.0, 0.0, 0.0)];
    [butt setTitle:@"hello" forState:UIControlStateNormal];
    [butt setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [self.view addSubview:butt];

используйте понятие подвидов. Возьмите 3 элемента управления,UIButton (200x270), UILabel (200x120) и UIImageView (200x150). Назначьте изображение на UIImageView и набор текста UILabel. Расположите элементы управления label и imageview на основе (x,y) расположения UIButton.

в конце концов, вы должны иметь что-то вроде:

для следующих случаев:

UIButton *button;
UILabel *label;
UIImageView *imageView;

[button addSubView:imageView];
[button addSubView:label];
[testBtn setBackgroudImage: [UIImage imageNamed:@"Image name.png"] forState:UIControlStateNormal];
[testBtn setTitle:@"Your text" forState:UIControlStateNormal];

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

вы можете играть с contentVerticalAlignment и contentHorizontalAlignment свойства UIButton (наследуется от UIControl).

вы также можете использовать titleEdgeInsets и imageEdgeInsets свойства, чтобы переместить заголовок и изображение из размещения, которое они получают на основе свойств выравнивания.

если вы хотите очень точное или пользовательское размещение, я предлагаю переопределить titleRectForContentRect: и imageRectForContentRect: методы UIButton. Они позволяют определить рамки для вашего заголовка и изображения, и они вызываются всякий раз, когда кнопка должна быть выложена. Одно предупреждение, если вы хотите ссылаться self.titleLabel внутри titleRectForContentRect:, убедится self.currentTitle определена в первую очередь. Я получал плохую ошибку доступа, возможно, метод вызывается при первой инициализации titleLabel.

В Swift 3

let button = UIButton()

//make sure the image (jpg, png) you are placing in the button
//is about the right size or it will push the label off the button

//add image
let image = UIImage(named:"my_button_image")
button.setImage(image, for: .normal)
button.imageView?.contentMode = .scaleAspectFit
button.imageEdgeInsets = UIEdgeInsets(top:0, left:-30, bottom:0, right:0) //adjust these to have fit right

//add title
button.setTitle("Fan", for: .normal)
button.titleEdgeInsets = UIEdgeInsets(top:0, left:10, bottom:0, right:0) //adjust insets to have fit how you want

//add button to your view - like in viewDidLoad or your own custom view setup
addSubview(button)

Не забудьте установить якоря, если это делается программно, чтобы он появился/прикрепите его к ссылке на кнопку в Interface Builder при использовании раскадровки

если вы хотите иметь больше контроля над макетом, создать подкласс UIControl и организовать вид, который вы хотите (UILabel,UIImageView) в файле xib. Тогда вы можете использовать Autolayout регулярно без необходимости сортировать UIEdgeInsets.

С помощью кнопки subviews работал для меня в Swift 4.

  • создать свою кнопку
  • установить изображение для кнопки
  • создать метку для текста
  • добавить метку в качестве подвида кнопки
  • ограничьте метку внутри кнопки

           let imageAndTextButton : UIButton = {
                let button = UIButton(frame: .zero)
                button.tintColor = .clear
                button.setImage(#imageLiteral(resourceName: "buttonImage"), for: .normal)
                button.imageView?.contentMode = .scaleToFill
                button.translatesAutoresizingMaskIntoConstraints = false
                return button
            }()
            let textForButtonLabel = UILabel(frame: .zero)
            textForButtonLabel.translatesAutoresizingMaskIntoConstraints = false
            textForButtonLabel.attributedText = NSAttributedString(string: "Text For Button", attributes: buttonTextAttributes)
            textForButtonLabel.textAlignment = .center
            textForButtonLabel.backgroundColor = .clear
            imageAndTextButton.addSubview(textForButtonLabel)
            imageAndTextButton.addConstraint(NSLayoutConstraint(item: textForButtonLabel, attribute: .centerX, relatedBy: .equal, toItem: imageAndTextButton, attribute: .centerX, multiplier: 1.0, constant: 0))
            imageAndTextButton.addConstraint(NSLayoutConstraint(item: textForButtonLabel, attribute: .centerY, relatedBy: .equal, toItem: imageAndTextButton, attribute: .centerY, multiplier: 1.0, constant: 0))