UIButton không nghe cài đặt chế độ nội dung?


91

firstButton là một UIButton thuộc loại Custom. Tôi lập trình đặt ba trong số chúng trên mỗi ô của bảng, do đó:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

Ở những nơi khác, tôi đang nói với clipToBounds. Những gì tôi nhận được là một phần của hình vuông trung tâm của hình ảnh, chứ không phải là một kết xuất theo tỷ lệ khía cạnh của nó. Tôi đã thử nhiều cách này, bao gồm cả việc đặt thuộc tính chế độ trên firstButton.imageView, cách này dường như cũng không hoạt động.


1
Xem giải pháp của Chris Nolet bên dưới: button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

Xem stackoverflow.com/a/28205566/481207 cho thấy rằng việc đặt cả contentVerticalAlignment và contentHorizontalAlignment là bắt buộc đối với UIViewContentModeScaleAspectFit.
Matt,

Câu trả lời:


187

Tôi đã từng gặp vấn đề tương tự. Tôi thấy câu hỏi này hơi cũ, nhưng tôi muốn cung cấp một câu trả lời rõ ràng và chính xác để tiết kiệm cho những người khác (như tôi) một lúc nào đó khi nó xuất hiện trong kết quả tìm kiếm của họ.

Tôi đã mất một chút tìm kiếm và thử nghiệm, nhưng tôi đã tìm ra giải pháp. Chỉ cần đặt ContentMode của ImageView "ẩn" bên trong UIButton.

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

Có lẽ đó là những gì Dan Ray đang ám chỉ trong câu trả lời được chấp nhận của mình, nhưng tôi nghi ngờ là không.


1
Không, không phải vậy. Giải pháp mà tôi đã giải quyết là sử dụng UIImageView để giữ hình ảnh, sau đó là UIButton rõ ràng, rõ ràng, thuộc loại "tùy chỉnh" ở trên cùng.
Dan Ray,

Dave, ít nhất là trên iOS 3.2, giải pháp của bạn dường như không hiệu quả với tôi. Thật tệ, bởi vì tôi đã hy vọng có được sự nổi bật của hình ảnh khi nhấp vào "miễn phí". Tôi thậm chí còn đảm bảo rằng button.imageView không phải là nơi tôi đặt contentMode và đặt hình ảnh sau khi đặt contentMode, giống như bạn đang làm.
Jacques

2
Chỉ cần làm rõ, "không hoạt động" có nghĩa là "hình ảnh được hiển thị ở độ phân giải đầy đủ, không bị thu nhỏ như tôi đã hy vọng".
Jacques

Jacques, những điều trên phù hợp với tôi trong iOS 4.x. Thật không may, tôi có thể tái tạo vấn đề "sẽ không thay đổi kích thước" khi xây dựng với mục tiêu v3.2. Tôi đã thử thay đổi kích thước khung của chế độ xem UIButton, nhưng điều đó dường như cũng không giúp được gì. ugh.
Dave

4
Xem giải pháp của Chris Nolet bên dưới: button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Matt

74

Nếu bạn đang xử lý hình ảnh của UIButton (trái ngược với backgroundImage của nó), việc đặt contentMode trên chính UIButton hoặc trên imageView của nó không có tác dụng (mặc dù các câu trả lời khác nói gì).

Thay vào đó hãy làm điều này:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Hoặc kích thước hình ảnh của bạn cho phù hợp.

HOẶC chỉ sử dụng UIImageView (tuân theo đúng ContentMode) có gắn UITapGestureRecognizer hoặc UIButton trong suốt trên đó.


4
Điều này hoạt động đối với trường hợp của tôi trong iOS 7 trong khi tất cả các trường hợp khác ở đây thì không.
Byte

5
Cài đặt nội dung Căn chỉnh ngang và nội dung Căn chỉnh dọc là giải pháp chính xác. Xem stackoverflow.com/a/28205566/481207 để biết giải thích.
Matt,

1
Đây là câu trả lời tôi đang tìm kiếm.
ninjaneer

4
Câu trả lời này không chính xác. Bạn làm cần phải thiết lập contentModetrên imageViewnếu bạn muốn làm bất kỳ loại điền khía cạnh hoặc phù hợp, như câu trả lời khác đã làm rõ. Tham khảo: stackoverflow.com/a/7944316/746890 .
Chris Nolet

51

Thay vì đặt contentModetrên chính nút, bạn sẽ muốn đặt contentHorizontalAlignmentcontentVerticalAlignmentcác thuộc tính và (quan trọng) contentModecủa nút imageViewcho bất kỳ loại điền hoặc phù hợp nào. Đây là một ví dụ:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Tất nhiên, bạn cũng có thể làm những việc khác như căn chỉnh hình ảnh của nút với đầu nút. Nếu bạn không cần điền hoặc phù hợp với các khía cạnh, bạn chỉ có thể tự đặt căn chỉnh:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

Trong Swift, bạn sẽ muốn sử dụng:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

Điều này hoạt động cho tất cả các phiên bản của iOS, bao gồm các phiên bản mới nhất có bố cục tự động, (tức là iOS 4 lên đến iOS 11+).


2
Cảm ơn Chris - điều đó đã giải quyết được vấn đề của tôi, hay đúng hơn, nó đã kết hợp với contentEdgeInsets, để đưa hình ảnh của tôi ra khỏi mép trên một chút.
Rob Reuss

7

Sau vài giờ nhầm lẫn, đây là cách tôi đã làm cho nó hoạt động trong iOS 3.2. Như dusker đã đề cập, việc sử dụng setBackgroundImage thay vì setImage đã thực hiện công việc cho tôi.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

6

Câu trả lời là sử dụng UIImageView với tất cả các cài đặt Chế độ nội dung đáng yêu mà bạn muốn, sau đó đặt một nút tùy chỉnh lên trên nó. Ngạc nhiên rằng bạn không thể làm điều đó tất cả trong một lần, nhưng có vẻ như bạn không thể.


4

Đã tìm thấy một bản sửa lỗi cho điều này. Đặt thuộc adjustsImageWhenHighlightedtính của UIButtonthành NO.

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

Hi vọng điêu nay co ich. Các bạn cứ comment bên dưới mình sẽ theo dõi nếu các bạn thắc mắc.


Đây là giải pháp hoàn hảo.
Gaurav

Không hoạt động. Điều này chỉ ngăn nút không nổi bật.
Matt,

4

Câu trả lời của tôi tương tự như của Kuba. Tôi cần hình ảnh của mình được thiết lập theo chương trình.

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}

3

Giải pháp duy nhất phù hợp với tôi:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


1

Thay vì setImage, hãy thử setBackgroundImage


3
Hmp. A, thật ngu ngốc, nó nên tôn trọng cài đặt CHẾ ĐỘ NỘI DUNG cho NỘI DUNG của nó, phải không? Và B, nó VẪN có vẻ không tôn trọng cài đặt chế độ - nó hiện bị khóa thành "duỗi" (trong trường hợp này, giống như "bóp" hơn) và không mở rộng nội dung theo khía cạnh của nó tỉ lệ.
Dan Ray

1

Tôi tin rằng chúng tôi gặp sự cố đơn giản về trình tạo giao diện ở đây - dường như IB bỏ qua bất kỳ thay đổi nào về chế độ nội dung SAU KHI bạn đã đặt thuộc tính hình ảnh.

giải pháp rất đơn giản: đặt chế độ nội dung, xóa tên hình ảnh đã đặt trước đó (đảm bảo bạn xóa nó ở tất cả các trạng thái, mặc định, được đánh dấu, v.v.), sau đó nhập lại tên hình ảnh mong muốn ở tất cả các trạng thái mong muốn - et voilà .


1
cùng đi để lập trình bộ nội dung chế độ - không đặt hình ảnh trước khi thiết lập nội dung chế độ
JohnPayne

0

Tôi cũng khuyên bạn nên xem xét đặc adjustsImageWhenHighlighted UIButtontính để tránh những biến dạng kỳ lạ của hình ảnh khi nhấn nút.


0

Khi cố gắng tìm ra điều này, phương pháp của tôi trở nên phức tạp hơn một chút khi thời gian trôi qua, và tôi kết hợp phân lớp con UIButton và ghi đè setHighlighted:

Đối với tôi, nó hoạt động nếu chỉ giảm alpha hình ảnh xuống 0,5, bởi vì chúng trên nền đen.

Tuy nhiên, nó chỉ hoạt động nếu tôi nhận xét ra [super setHighlighted:] (nơi nó xuất hiện mã co giãn hình ảnh đang diễn ra), điều này không giống như cách thích hợp để giải quyết vấn đề này chút nào ... mọi thứ dường như là hoạt động tốt, mặc dù. Chúng tôi sẽ xem nó hoạt động như thế nào khi tôi tiếp tục làm việc với nó.

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}

1
Nếu bất kỳ ai thấy điều này có liên quan, phương pháp trên của tôi dường như hoạt động tốt cho đến khi tôi đặt các nút trên UIScrollView, nơi đôi khi điểm đánh dấu của nút bị "kẹt", đó là điều tôi nghi ngờ cuối cùng có thể xảy ra.
jankins

0

Nếu bất kỳ ai đang tìm kiếm câu trả lời hoạt động trong iOS 6 và iOS 7 và bảng phân cảnh:

Bạn có thể đặt hình ảnh trong bảng phân cảnh của mình:

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

Và sau đó:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}

0

Nếu UIButton dường như không lắng nghe cài đặt giới hạn bố cục, hãy kiểm tra xem hình ảnh có lớn hơn kích thước nút hay không. Luôn sử dụng hình ảnh @ 2x và @ 3x cho độ phân giải võng mạc.


0

Hai thứ này (ban đầu khá khó tìm) sẽ kéo giãn hình ảnh UIButton của bạn để vừa với kích thước nút:

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

người ta nên luôn cố gắng thiết lập như vậy trong Bảng phân cảnh thay vì mã.

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.