2009-07-12 40 views
28

Tôi có UIButton và tôi đang cố đặt tiêu đề và hình ảnh trên đó.Tiêu đề UIButton và truy vấn căn chỉnh hình ảnh

Tôi muốn căn chỉnh tiêu đề cho một UIButton ở bên trái và đặt hình ảnh được căn chỉnh về bên phải. Tôi đang cố gắng để có được giao diện của nút trong ứng dụng hẹn giờ trong đồng hồ (một trong đó nói "khi hẹn giờ kết thúc").

Tôi đã chơi với contentHorizontalAlignment, contentEdgeInsets, titleEdgeInsetsimageEdgeInsets để đạt được mục tiêu của mình, nhưng vô ích. Các tài liệu cũng khá thưa thớt cho cùng một.

Làm cách nào để tôi có thể đạt được điều tương tự?

Các câu hỏi khác có liên quan, ứng dụng Hẹn giờ trong đồng hồ có hai tập hợp Văn bản, một văn bản được canh lề sang trái và căn phải khác với hình ảnh? Làm thế nào có thể được thực hiện trong một UIButton? (Tôi không cần chức năng đó mặc dù tại thời điểm này).

Trả lời

35

Thay đổi imageEdgeInsets tài sản trên UIButton và sau đó chỉ cần sử dụng setImage:forState:

+1

Đây là cách chính xác để thực hiện việc này, nếu bạn đang sử dụng UIButton. xem bảng là một con thú khác nhau. –

+5

Đồng ý, nhưng OP đã không đề cập đến quan điểm bảng :) – Bill

9

Hãy nhớ rằng UIButton kế thừa từ UIView và vì vậy bạn có thể thêm các bản xem phụ vào nó giống như bất kỳ chế độ xem nào khác. Trong trường hợp của bạn, bạn sẽ tạo ra một nút, sau đó thêm một UILabel ở phía bên trái và một UIImage ở bên phải:

// Create the button 
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 

// Now load the image and create the image view 
UIImage *image = [UIImage imageNamed:@"yourImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(/*frame*/)]; 
[imageView setImage:image]; 

// Create the label and set its text 
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(/*frame*/)]; 
[label setText:@"Your title"]; 

// Put it all together 
[button addSubview:label]; 
[button addSubview:imageView];
+0

Điều này dường như không hoạt động tốt. Tôi có hình nền trên nút và nhãn không hiển thị nếu tôi đặt hình nền.Nếu tôi xóa hình nền khỏi nút, nhãn sẽ hiển thị? Tôi đã thêm lable vào khung nhìn cha mẹ của UIButton và liên kết để ngồi trên đầu trang của UIButton và nó hoạt động sau đó. Bất kỳ ý tưởng tại sao nó hoạt động theo cách này? – siasl

+2

Thông thường, loại hành vi đó thể hiện chính nó khi hình nền được thêm làm tiểu sử của UIButton ở đầu chế độ xem tùy chỉnh của bạn. Thay vì đặt thuộc tính backgroundImage của nút, hãy nghĩ đến việc thêm UIImageView cho hình nền, sau đó thêm nội dung tùy chỉnh khác ở trên cùng của chế độ xem hình ảnh đó. – Tim

+0

Không cần phải cuộn logic của riêng bạn - sử dụng thuộc tính 'imageEdgeInsets' trên UIButton và' setImage: forState: '. – Bill

47

Đây là mã tôi sử dụng cho rằng:

//Right-align the button image 
CGSize size = [[myButton titleForState:UIControlStateNormal] sizeWithFont:myButton.titleLabel.font]; 
[myButton setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, -size.width)]; 
[myButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, myButton.imageView.image.size.width + 5)]; 
+0

Đây là IMO tốt hơn một chút, nếu hơi quá ngắn gọn, câu trả lời bằng mã so với câu trả lời được bình chọn hàng đầu bởi @Bill cho bạn biết sử dụng các cuộc gọi API này nhưng không ' t hiển thị gọi họ. Nó sẽ tốt hơn nếu nó cho thấy gọi setImage: forState :. Ngoài ra, tôi đã tìm thấy trong một số trường hợp như actionSheets rằng một khi bạn đã setImageEdgeInsets bạn không cần phải điều chỉnh titleEdgeInsets - chúng đã đưa chiều rộng của hình ảnh của bạn vào tài khoản rồi. YMMV. – natbro

+3

Trong trường hợp bạn đặt 'contentHorizontalAlignment' thành' UIControlContentHorizontalAlignmentRight', bạn cũng cần thêm một inset vào bên trái trong 'titleEdgeInsets'. Đây là: '[myButton setTitleEdgeInsets: UIEdgeInsetsMake (0, -imageSize.width, 0, imageSize.width)];' – vilanovi

-2

Tạo một lớp con UIButton và ghi đè phương pháp layoutSubviews của nó để căn chỉnh hình ảnh văn bản & bạn lập trình. Hoặc sử dụng một cái gì đó như https://github.com/stevestreza/BlockKit/blob/master/Source/UIView-BKAdditions.h để bạn có thể triển khai layoutSubviews bằng cách sử dụng một khối.

+0

Liên kết tới git hub hiện không hoạt động –

+0

https://github.com/stevestreza/BlockKit/ blob/master/Source/UIView-BKAdditions.h –

+0

Cảm ơn bạn đã cập nhật liên kết :). Bây giờ làm việc –

13

Các mã sau hoạt động:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.frame = buttonRect; 
[button setTitle:@"A title" forState:UIControlStateNormal]; 
[button setImage:buttonImage forState:UIControlStateNormal]; 
button.imageEdgeInsets = UIEdgeInsetsMake(0.0, WIDTH(button.titleLabel) + 10.0, 0.0, 0.0); 
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; 
4

Bạn cũng có thể ghi đè lên titleRectForContentRect:imageRectForContentRect: phương pháp của UIButton ở vị trí thứ tự văn bản và hình ảnh của bạn bất cứ nơi nào bạn muốn.

1

Đây là lớp con của UIButton trong Swift sắp xếp hình ảnh ở bên trái và văn bản ở giữa. Đặt imageLeftInset thành giá trị mong muốn của bạn.

class LeftImageAlignedButton : UIButton { 

var imageLeftInset : CGFloat = 10.0 

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.contentHorizontalAlignment = .Left 
    if let font = titleLabel?.font { 
     let textWidth = ((titleForState(state) ?? "") as NSString).sizeWithAttributes([NSFontAttributeName:font]).width 
     let imageWidth = imageForState(state)?.size.width ?? 0.0 
     imageEdgeInsets = UIEdgeInsets(top: 0, left: imageLeftInset, bottom: 0, right: 0) 
     titleEdgeInsets = UIEdgeInsets(top: 0, left: bounds.width/2 - textWidth/2.0 - imageWidth, bottom: 0, right: 0) 
    } 
} 
} 
4

Trong Swift cho bất cứ ai quan tâm (với khoảng cách 10pt):

let size = (self.titleForState(UIControlState.Normal)! as NSString).sizeWithAttributes([NSFontAttributeName:self.titleLabel!.font]) 
let offset = (size.width + 10) 
self.imageEdgeInsets = UIEdgeInsetsMake(0, offset, 0, -offset) 
self.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, self.imageView!.frame.size.width + 10) 
4

Để sử dụng trên iOS 9, tôi đã cố gắng rất nhiều câu trả lời trong chủ đề này nhưng không ai trong số họ phù hợp với tôi. Tôi tìm thấy câu trả lời cho bản thân mình như sau:

class MyButton: UIButton { 

    override func layoutSubviews() { 
    super.layoutSubviews() 

    self.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left 

    if self.imageView?.image != nil { 
     // Move icon to right side 
     self.imageEdgeInsets = UIEdgeInsets(
     top: 0, 
     left: self.bounds.size.width - self.imageView!.image!.size.width, 
     bottom: 0, 
     right: 0) 

     // Move title to left side 
     self.titleEdgeInsets = UIEdgeInsetsMake(0, -self.imageView!.frame.size.width + 8, 0, 0) 

    } 
    } 
} 

SWIFT 3:

class MyButton: UIButton { 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     self.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left 

     if self.imageView?.image != nil { 
      // Move icon to right side 
      self.imageEdgeInsets = UIEdgeInsets(
       top: 0, 
       left: self.bounds.size.width - self.imageView!.image!.size.width, 
       bottom: 0, 
       right: 0) 

      // Move title to left side 
      self.titleEdgeInsets = UIEdgeInsetsMake(0, -self.imageView!.frame.size.width + 8, 0, 0) 

     } 
    } 
} 

Tôi hy vọng nó sẽ giúp ai đó trong trường hợp như tôi!

+1

Công việc tuyệt vời, tôi cập nhật cho bạn bằng Swift 3 –

Các vấn đề liên quan