Hình ảnh UIButton + Văn bản IOS


128

Tôi cần một UIButtonvới hình ảnh & văn bản . Hình ảnh phải ở trên cùng và văn bản nằm dưới hình ảnh cả hai nên có thể nhấp được.


Hy vọng điều này có ích, Xem [UiButton với cả TEXT và IMAGE] [1] stackoverflow.com/questions/4926581/iêu [1]: stackoverflow.com/questions/4926581/. Sau đó, bạn có thể thêm UITapGestureRecognizer trên chế độ xem của mình để xử lý tùy chỉnh nhấp chuột.
Humayun Ghani

22
Âm thanh giống như một đặc điểm kỹ thuật yêu cầu hơn là một câu hỏi.
Abizern

Xem câu trả lời được chấp nhận và điều này commandshift.co.uk/blog/2013/03/12/uibutton-edge-insets về UIButton Edges
onmyway133

Câu trả lời:


309

Tôi thấy câu trả lời rất phức tạp, tất cả đều sử dụng mã. Tuy nhiên, nếu bạn đang sử dụng Trình tạo giao diện , có một cách rất dễ thực hiện:

  1. Chọn nút và đặt tiêu đề và hình ảnh. Lưu ý rằng nếu bạn đặt nền thay vì hình ảnh thì hình ảnh sẽ được thay đổi kích thước nếu nó nhỏ hơn nút.Hình ảnh và tiêu đề cơ bản của IB
  2. Đặt vị trí của cả hai mục bằng cách thay đổi cạnh và phần trong. Bạn thậm chí có thể kiểm soát sự liên kết của cả hai trong phần Điều khiển.

Vị trí IB Bộ điều khiển IB

Bạn thậm chí có thể sử dụng cùng một cách tiếp cận theo mã, mà không cần tạo UILabels và UIImages bên trong như các giải pháp khác được đề xuất. Luôn giữ nó đơn giản!

EDIT: Đã đính kèm một ví dụ nhỏ có 3 thứ được đặt (tiêu đề, hình ảnh và nền) với các phần chính xác Nút xem trước


2
Chính xác. Bạn sẽ muốn sử dụng các phần chèn cạnh trên tiêu đề và hình ảnh để căn chỉnh hai cái chính xác. Bạn có thể thực hiện điều này bằng mã bằng cách đặt thuộc tính titleEdgeInsets và contentEdgeInsets.
Tim Mahoney

4
vâng, nó gần như đúng chỉ cần bạn phải đặt Backgroundhình ảnh thay vì Image, nếu không bạn sẽ không thấy tiêu đề thậm chí không đặt các giá trị chèn vào để định vị lại tiêu đề.
holex

6
Tôi cũng gặp rắc rối với điều này. Nếu tiêu đề của bạn không hiển thị, hãy thử đặt bù trừ âm cho nó. Có vẻ như IB tự động đẩy nó ra bên phải hình ảnh.
brians

8
Điều này chỉ hiển thị hình ảnh và văn bản cạnh nhau, phải không? Có cách nào để thay đổi hướng từ trên xuống dưới không? Đây là những gì câu hỏi ban đầu nêu và những gì tôi đang tìm kiếm là tốt. Cảm ơn!
flohei

12
Đối với những người sử dụng Xcode 8, bạn có thể không thấy thuộc tính Edge. Văn bản có thể biến mất sau khi thêm một hình ảnh là tốt. Nó thay đổi văn bản thành màu trắng và nếu bạn ở trên nền trắng, có vẻ như nó đã biến mất. Thay đổi màu văn bản và nó sẽ xuất hiện gần với hình ảnh. Bạn có thể điều chỉnh các phần tử bên dưới Thanh tra kích thước.
Micah Montoya

67

Tôi nghĩ rằng bạn đang tìm kiếm giải pháp này cho vấn đề của bạn:

UIButton *_button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setFrame:CGRectMake(0.f, 0.f, 128.f, 128.f)]; // SET the values for your wishes
[_button setCenter:CGPointMake(128.f, 128.f)]; // SET the values for your wishes
[_button setClipsToBounds:false];
[_button setBackgroundImage:[UIImage imageNamed:@"jquery-mobile-icon.png"] forState:UIControlStateNormal]; // SET the image name for your wishes
[_button setTitle:@"Button" forState:UIControlStateNormal];
[_button.titleLabel setFont:[UIFont systemFontOfSize:24.f]];
[_button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; // SET the colour for your wishes
[_button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; // SET the colour for your wishes
[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, -110.f, 0.f)]; // SET the values for your wishes
[_button addTarget:self action:@selector(buttonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside]; // you can ADD the action to the button as well like

... phần còn lại của việc tùy chỉnh nút là nhiệm vụ của bạn bây giờ và đừng quên thêm nút vào chế độ xem của bạn.

CẬP NHẬT # 1CẬP NHẬT # 2

hoặc, nếu bạn không cần một nút động, bạn có thể thêm nút của mình vào chế độ xem trong Trình tạo giao diện và bạn cũng có thể đặt các giá trị tương tự ở đó. Nó khá giống nhau, nhưng đây là phiên bản này trong một bức tranh đơn giản.

bạn cũng có thể thấy kết quả cuối cùng trong Trình tạo giao diện như trên ảnh chụp màn hình.

nhập mô tả hình ảnh ở đây


EdgeInsets chỉ hoạt động khi bạn có "đặt hình ảnh nút" và khi bạn đặt hình ảnh nút bạn không thể thấy tiêu đề. Và nếu bạn đặt hình nền thì EdgeInsets không thể áp dụng cho hình ảnh. và bạn có thể thấy tiêu đề. Vì vậy, bạn không thể đặt edgeinsect cho cả hai cùng một lúc.
Badal Shah

@BadalShah, vâng, có một số tình huống (tùy thuộc vào kích thước nút, kích thước hình ảnh, độ dài tiêu đề, v.v ...) khi những gì bạn nói là đúng và bạn không thể xem tiêu đềhình ảnh cùng một lúc vì hình ảnh đẩy ra tiêu đề của khu vực nhìn thấy; nhưng kịch bản đó hoàn toàn không phải là chung chung, tình huống chung là cả tiêu đềhình ảnh đều có thể và sẽ xuất hiện cùng một lúc.
holex

29

Xcode-9Xcode-10 Apple đã thực hiện một số thay đổi liên quan đến Edge Inset ngay bây giờ, bạn có thể thay đổi nó theo trình kiểm tra kích thước.

Vui lòng làm theo các bước dưới đây:

Bước 1: Nhập văn bản và chọn hình ảnh bạn muốn hiển thị:

nhập mô tả hình ảnh ở đây

Bước 2: Chọn điều khiển nút theo yêu cầu của bạn như trong hình bên dưới:

nhập mô tả hình ảnh ở đây

Bước 3: Bây giờ đi đến thanh tra kích thước và thêm giá trị theo yêu cầu của bạn:

nhập mô tả hình ảnh ở đây


9
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.imageView.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

nhưng mã sau sẽ hiển thị nhãn ở trên và hình ảnh trong nền

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.background.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

Không cần sử dụng nhãn và nút trong cùng một điều khiển vì UIButton có thuộc tính UILabel và UIimageview.


1
Tôi cần định vị hình ảnh ở trên cùng và văn bản bên dưới hình ảnh cả hai đều có thể nhấp được ..
Codeen

4

Sử dụng mã này:

UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.imageView.frame=CGRectMake(0.0f, 0.0f, 50.0f, 44.0f);///You can replace it with your own dimensions.
    UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 35.0f, 50.0f, 44.0f)];///You can replace it with your own dimensions.
    [button addSubview:label];

4

Sử dụng mã này:

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(0, 10, 200, 52)];
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] 
stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
[sampleButton addTarget:self action:@selector(buttonPressed)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton]

4

Tôi đã gặp vấn đề tương tự và tôi khắc phục nó bằng cách tạo một lớp con mới UIButtonvà ghi đè layoutSubviews:phương thức như sau:

-(void)layoutSubviews {
    [super layoutSubviews];

    // Center image
    CGPoint center = self.imageView.center;
    center.x = self.frame.size.width/2;
    center.y = self.imageView.frame.size.height/2;
    self.imageView.center = center;

    //Center text
    CGRect newFrame = [self titleLabel].frame;
    newFrame.origin.x = 0;
    newFrame.origin.y = self.imageView.frame.size.height + 5;
    newFrame.size.width = self.frame.size.width;

    self.titleLabel.frame = newFrame;
    self.titleLabel.textAlignment = UITextAlignmentCenter;

}

Tôi nghĩ rằng câu trả lời của Angel García Olloqui là một giải pháp tốt khác, nếu bạn đặt tất cả chúng bằng tay với trình tạo giao diện nhưng tôi sẽ giữ giải pháp của mình vì tôi không phải sửa đổi nội dung cho từng nút của mình.


4

Tạo UIImageViewUILabel, và đặt hình ảnh và văn bản cho cả hai điều này .... sau đó Đặt nút tùy chỉnh trên imageView và Nhãn ....

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.png"]];
    imageView.frame = CGRectMake(x, y, imageView.frame.size.width, imageView.frame.size.height);
    [self.view addSubview:imageView];

UILabel *yourLabel = [[UILabel alloc] initWithFrame:CGRectMake(x, y,a,b)];
yourLabel.text = @"raj";
[self.view addSubview:yourLabel];

UIButton * yourBtn=[UIButton buttonWithType:UIButtonTypeCustom];
[yourBtn setFrame:CGRectMake(x, y,c,d)];
[yourBtn addTarget:self action:@selector(@"Your Action") forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:yourBtn];  

Đơn giản và hữu ích. Làm thế nào để thiết lập hình ảnh và tiêu đề nổi bật?
DawnSong

cho tập hợp lableHighlightedTextColor và bạn phải chơi với forControlEvents
Rajneesh071

3

Bạn nên tạo chế độ xem hình ảnh tùy chỉnh cho hình ảnh và nhãn tùy chỉnh cho văn bản và bạn thêm vào nút của mình dưới dạng xem xét. Đó là nó.

UIButton *yourButton = [UIButton buttonWithType:UIButtonTypeCustom];
yourButton.backgroundColor = [UIColor greenColor];
yourButton.frame = CGRectMake(140, 40, 175, 30);     
[yourButton addTarget:self action:@selector(yourButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:yourButton];

UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, yourButton.frame.size.width, yourButton.frame.size.height/2)];
imageView1.image =[UIImage imageNamed:@"images.jpg"];
[yourButton addSubview:imageView1];

UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, yourButton.frame.size.height/2, yourButton.frame.size.width, yourButton.frame.size.height/2)];
label.backgroundColor = [UIColor greenColor];
label.textAlignment= UITextAlignmentCenter;
label.text = @"ButtonTitle";
[yourButton addSubview:label];

Đối với mục đích thử nghiệm, sử dụng yourButtonSelected:phương pháp

-(void)yourButtonSelected:(id)sender{
    NSLog(@"Your Button Selected");

}

Tôi nghĩ nó sẽ hữu ích cho bạn.


3

Điều đó thực sự đơn giản, chỉ cần thêm hình ảnh vào nền của nút của bạn và đưa văn bản vào nhãn hiệu nút cho uicontrolstaten normal. Đó là nó.

[btn setBackgroundImage:[UIImage imageNamed:@"img.png"] forState:UIControlStateNormal];
[btn setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[btn setTitle:@"Click Me" forState:UIControlStateNormal];

4
... và làm thế nào để văn bản đi dưới hình ảnh?
holex

@holex: Cảm ơn bạn rất nhiều vì đã chỉ đạo tôi, tôi đã tìm thấy lỗ hổng trong đó và sau đó thay đổi cho phù hợp.
Dhruv

0

phiên bản nhanh chóng:

var button = UIButton()

newGameButton.setTitle("Новая игра", for: .normal)
newGameButton.setImage(UIImage(named: "energi"), for: .normal)
newGameButton.backgroundColor = .blue
newGameButton.imageEdgeInsets.left = -50

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.