2013-07-31 41 views
10

Tôi có UIView có chứa UIButton. UIButton có 2 tựa đề được đặt cho các trạng thái UIControlStateNormal ("Follow") và UIControlStateSelected ("Following"). Tôi đang sử dụng bố trí tự động trên UIButton và nó có một hạn chế để được một khoảng cách nhất định từ phía trên của superview và khác là một khoảng cách nhất định từ phía bên trái của superview. Tôi cũng đã sử dụng "Kích thước để vừa với Nội dung" trên đó.Kích thước nội tại không cập nhật khi thay đổi trạng thái UIButton

Khi tôi đặt nút ở trạng thái đã chọn từ mã, tiêu đề thay đổi chính xác nhưng chiều rộng nội tại của UIButton không thay đổi sao cho khi thay đổi từ "Theo dõi" thành "Theo dõi", văn bản sẽ được bỏ qua.

self.selected = self.following; 

enter image description hereenter image description here

Khi tôi tiếp cận vấn đề khác nhau và chỉ cần thay đổi văn bản cho UIControlStateNormal khi ai đó chạm vào nút, những thay đổi nút kích thước chính xác.

NSString *title = (self.following) ? @"Following" : @"Follow" 
[self setTitle:title forState:UIControlStateNormal]; 

enter image description hereenter image description here

Đây có phải là một lỗi trong UIKit? Tôi mong đợi nút thay đổi kích thước nội tại của nó để phản ánh chính xác kích thước mới của văn bản khi trạng thái của nó thay đổi đặc biệt vì có những thứ khác tôi muốn thay đổi bên cạnh văn bản cho trạng thái 2 nút.

Trả lời

21

Giống như David Caunt chỉ ra trong một chú thích, gọi invalidateIntrinsicContentSize sẽ gây autolayout để thay đổi kích thước nút để phù hợp với nó là nội dung mới .

self.selected = self.following; 
[self invalidateIntrinsicContentSize]; 

PS. David, nếu bạn muốn đăng commant của bạn như là một câu trả lời tôi sẽ loại bỏ của tôi.

+1

Có ai đã thử điều này muộn (iOS 8.2+) không? Giải pháp trực tiếp duy nhất đang làm việc cho tôi là @ abdullah's setTitle: forState. Tôi cũng đã thử sau dòng đó với layoutIfNeeded. –

+0

để hoàn thành và tương thích với bất kỳ hệ thống bố cục nào tôi đã phải làm theo điều này với gọi setNeedsLayout và gọi nó trên mọi giám sát của superview cho đến khi không còn ... dường như là cách duy nhất thay đổi sẽ áp dụng cho mọi thứ có kích thước va chạm. (nếu đưa vào các bản xem trước, v.v.) – Ben

1

Trong bảng phân cảnh của bạn, hãy chọn UIButton và trên trình chỉnh sửa lựa chọn hàng đầu-> kích thước để phù hợp với kích thước nội dung.

EDIT: Hãy thử điều này:

[self.myButton setTitle:@"Following" forState:UIControlStateSelected]; 
[self.myButton sizeToFit]; 
+0

Tôi đã thử điều này, nó được đề cập trong câu hỏi. – jvergeldedios

+0

@jvedi Đảm bảo UIButton của bạn được chọn khi bạn thực hiện việc này. –

+0

Đó là, vẫn không thay đổi. – jvergeldedios

0

Cho dù đây là một lỗi, hay chỉ là cách nó được, tôi không biết, nhưng có vẻ như bạn sẽ phải làm việc xung quanh nó - - Tôi không nghĩ bạn đang làm gì sai. Nếu bạn muốn chuyển đổi giữa lựa chọn và không sau mỗi lần liên lạc, bạn có thể làm một cái gì đó như thế này:

- (IBAction)buttonClick:(UIButton *)sender { 
    sender.selected = !sender.selected; 
    if (sender.selected) { 
     [self.button setTitle:@"Following" forState:UIControlStateNormal]; 
     //Do whatever else you want to do here for the selected state 
    }else{ 
     [self.button setTitle:@"Follow" forState:UIControlStateNormal]; 
    } 
} 
+0

Tôi đã kết thúc với một cái gì đó như thế này, nhưng nó vẫn có vẻ lạ với tôi rằng việc chuyển đổi nhà nước sẽ không chỉ làm việc như thế này. Oh well. – jvergeldedios

+0

@jvedi, tôi đồng ý. Nó có vẻ kỳ lạ rằng kích thước nội tại không làm việc cho UIControlStateSelected. Nghe có vẻ như thứ gì đó mà Apple vừa quên thực hiện. – rdelmar

+6

Bạn chỉ cần gọi 'invalidateIntrinsicContentSize' và nó sẽ hoạt động. 'setTitle: forState' có thể gọi phương thức này trong nội bộ. –

1

Để tôi đặt contentEdgeInsets đã cho tôi giải pháp đáng tin cậy duy nhất.

Tôi đang sử dụng các nút tùy chỉnh, với hình nền. Vì vậy, lát đi vào hình ảnh. Nó chỉ ra rằng cách bạn cắt hình ảnh cũng có thể ảnh hưởng đến kích thước nội dung nội tại! Kiểm tra nó! Vì vậy, tôi đã phải chắc chắn rằng tôi đã cắt giống hệt nhau giữa các hình ảnh cho các tiểu bang khác nhau. Tôi cũng đang sử dụng chuỗi được phân bổ. Các giải pháp được đăng ở đây không hoạt động đối với trường hợp của tôi.

Những gì tôi tìm thấy sau một ngày (!) Thử nghiệm là đặt đủ nội dungEdgeInsets giá trị trên nút làm cho nó hoạt động chính xác khi tiêu đề được thay đổi bằng cách sử dụng tự động trả lời. Không cần phải làm mất hiệu lực kích thước nội dung nội tại hoặc gọi bất kỳ mã bố cục nào nếu bạn làm điều này.

Bạn có thể đặt contentEdgeInsets bằng mã hoặc bằng IB.

self.button.contentEdgeInsets = UIEdgeInsetsMake(10.0, 16.0, 10.0, 16.0); 

Tôi nghĩ mã Swift giống hệt nhau ngoại trừ thuộc tính var.

Apple nói điều này trong tài liệu: "Nút sử dụng thuộc tính này để xác định nội tạiContentSize và sizeThatFits :.".

enter image description here

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