2011-02-10 32 views
14

Tôi có một UIButton mà tôi muốn thay đổi kích thước để phù hợp với bất kỳ văn bản bên trong nó. Nó có chiều rộng được thiết lập là 280, nhưng văn bản phải được bọc vào (các) dòng tiếp theo và mở rộng chiều cao của nút khi cần thiết.Làm cách nào để thay đổi kích thước một UIButton cho vừa với văn bản mà không có văn bản mở rộng hơn màn hình?

Tôi đã đặt ngắt dòng thành Word Wrap và đã thử sizeToFit nhưng điều đó chỉ làm cho nút này rộng hơn, không thẳng đứng.

Trả lời

2

tôi quản lý để làm cho nó làm việc trong một chủng loại UIButton:

@interface UIButton (ExpandsVertically) 

- (CGSize)sizeThatFits:(CGSize)size; 

@end 

@implementation UIButton (Expandable) 

- (CGSize)sizeThatFits:(CGSize)size { 

    // for the width, I subtract 24 for the border 
    // for the height, I use a large value that will be reduced when the size is returned from sizeWithFont 
    CGSize tempSize = CGSizeMake(size.width - 24, 1000); 

    CGSize stringSize = [self.titleLabel.text 
         sizeWithFont:self.titleLabel.font 
         constrainedToSize:tempSize 
         lineBreakMode:UILineBreakModeWordWrap]; 

    return CGSizeMake(size.width - 24, stringSize.height); 
} 

@end 

Nếu bất cứ ai sử dụng này hãy chắc chắn để thiết lập:

myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap; 
2

Bạn có thể muốn xem UIKit Additions to NSString documentation bao gồm các phương pháp đo lường phông chữ bị hạn chế theo chiều rộng hoặc kích thước hộp cụ thể.

Khi bạn đặt tiêu đề của nút, bạn có thể đo chuỗi bằng cách sử dụng phương pháp sizeWithFont: forWidth: lineBreakMode: và cập nhật khung của nút dựa trên kích thước được trả lại (có thể cho phép một số đệm xung quanh các cạnh).

Rất tiếc, tôi không có ví dụ cụ thể cho bạn.

+0

Bạn đã dẫn tôi đi đúng hướng ... cảm ơn! – TigerCoding

31

Hãy chắc chắn rằng bạn thiết lập các văn bản trên nút của bạn theo cách này :

[myButton setTitle:@"my title" forState:UIControlStateNormal]; 

... và [myButton sizeToFit] sẽ hoạt động như một sự quyến rũ.

+3

Làm việc cho tôi. Cảm ơn. – Prazi

+15

Tôi nghĩ rằng điều này có thể không hoạt động đúng trên các nút có loại = custom – marmor

5

[button sizeToFit] không làm việc cho tôi, nhưng tôi đã tìm ra cách sử dụng IB một mình (xcode 4.5):

  1. Bấm vào UIButton
  2. trong kéo Kích thanh tra content hugging-1 (cả ngang và dọc)
  3. kéo compression resistance-1000 (đối với cả hai)
  4. dưới constraints nhấp chuột của UIButton trên Width và thay đổi priority-250
  5. Làm tương tự cho Chiều cao
  6. Bạn có thể sử dụng UIButton 's inset để kiểm soát đệm cho trái/phải/trên/dưới
+0

Bạn đã thử sử dụng inset? Nếu tôi sử dụng inset có vẻ như autolayout không đưa vào tài khoản trong khi tính toán chiều rộng dự kiến ​​vì vậy mặc dù chiều rộng nút phát triển nhưng nó không đủ để chứa text + left right inset – saurabh

0

Tôi đã phải đối mặt với một vấn đề tương tự, có chiều rộng hạn chế cho tôi nút và muốn chúng phát triển theo chiều dọc, tùy thuộc vào số lượng văn bản tôi muốn cung cấp cho chúng. tôi đã kết thúc với một giải pháp đơn giản, dựa trên những gì tôi đã học được trong các tài liệu của Apple (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html)

Tôi đã subclassed UIButton và ghi đè hai chức năng:

- (void)setBounds:(CGRect)bounds { 
    if (!CGRectEqualToRect(bounds, self.bounds)) { 
     [self invalidateIntrinsicContentSize]; 
    } 
    [super setBounds:bounds]; 
} 

- (CGSize)intrinsicContentSize { 
    // 
    CGSize size; 

    self.titleLabel.frame = CGRectMake(self.titleLabel.frame.origin.x, 
      self.titleLabel.frame.origin.y, 
      self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right, 
      0); 
    size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size]; 
    size = CGSizeMake(size.width, size.height + 20); 

    return size; 
} 

gì về cơ bản xảy ra ở đây là nút này làm mất kích thước nội tại của nó (chỉ khi các giới hạn thực sự mới - điều này là để ngăn chặn vòng lặp vô tận) và khi hệ thống yêu cầu kích thước nội dung nội tại, tôi tính toán lại dựa trên chiều rộng của nút. Chiều cao thêm 20px dành cho đệm. Tôi đã thử nhiều cách khác nhưng kể từ khi bố cục của tôi là tất cả dựa trên AutoLayout, tôi muốn một cái gì đó mà tôi không phải cập nhật bất cứ khi nào thiết bị quay hoặc như vậy. Điều này chỉ đơn giản là làm việc.

Chúc may mắn! Z.

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