簡體   English   中英

UIButton 不聽內容模式設置?

[英]UIButton doesn't listen to content mode setting?

firstButton 是一個自定義類型的 UIButton。 我以編程方式將其中三個放在表格的每個單元格中,因此:

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

在其他地方,我告訴它clipToBounds。 我得到的是圖像中心正方形的裁剪,而不是它的縱橫比例渲染。 我已經嘗試了很多方法,包括在 firstButton.imageView 上設置 mode 屬性,這似乎也不起作用。

我有同樣的問題。 我看到這個問題有點老了,但我想提供一個清晰正確的答案,以節省其他人(如我)在搜索結果中彈出的時間。

我花了一些搜索和試驗,但我找到了解決方案。 只需設置 UIButton 內的“隱藏”ImageView 的 ContentMode。

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

也許這就是丹雷在他接受的答案中暗指的,但我懷疑不是。

如果您正在處理 UIButton 的圖像(而不是它的 backgroundImage),則在 UIButton 本身或其 imageView 上設置 contentMode 沒有效果(盡管其他答案是這樣說的)。

或者這樣做:

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

或相應地調整圖像大小。

或者只使用一個 UIImageView(它正確地尊重 contentMode)和一個 UITapGestureRecognizer 附加到它,或者一個透明的 UIButton 在它上面。

而不是設置contentMode按鈕本身,你要設置contentHorizontalAlignmentcontentVerticalAlignment性能和(關鍵)的contentMode為按鈕的imageView任何種類方面的填充或適合的。 下面是一個例子:

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

當然,您還可以執行其他操作,例如將按鈕的圖像與按鈕頂部對齊。 如果您不需要方面填充或適合,您可以自行設置對齊方式:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

在 Swift 中,您需要使用:

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

這適用於所有版本的 iOS,包括具有自動布局的最新版本(即 iOS 4 到 iOS 11+)。

經過幾個小時的困惑,以下是我如何讓它在 iOS 3.2 下工作。 正如 dusker 所提到的,使用 setBackgroundImage 而不是 setImage 為我完成了這項工作。

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];

答案是使用 UIImageView 和你想要的所有可愛的內容模式設置,然后在它上面放置一個自定義按鈕。 愚蠢的是你不能一次完成所有的事情,但看起來你不能。

找到了解決方法。 UIButtonadjustsImageWhenHighlighted屬性設置為NO

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

希望這可以幫助。 歡迎在下方留言,有任何問題我都會跟進。

我的答案與庫巴的相似。 我需要以編程方式設置我的圖像。

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;
}

這兩件事(最初很難找到)會拉伸你的 UIButton 圖像以適應按鈕大小:

在此處輸入圖片說明 在此處輸入圖片說明

人們應該始終嘗試在 Storyboard 而不是代碼中設置這樣的設置。

唯一對我有用的解決方案:

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

斯威夫特 3

self.firstButton.imageView?.contentMode = .scaleAspectFill

我相信我們在這里有一個簡單的界面構建器問題 - 顯然,在您設置圖像屬性后,IB 會忽略任何內容模式更改。

解決方案很簡單:設置內容模式,刪除之前設置的圖像名稱(確保在所有狀態、默認、突出顯示等中將其刪除),然后在所有所需狀態中重新輸入所需的圖像名稱 - 等等.

而不是 setImage 嘗試 setBackgroundImage

如果有人正在尋找適用於 iOS 6 和 iOS 7 以及故事板的答案:

您可以在故事板中設置圖像:

在此處輸入圖片說明

進而:

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

我還建議查看adjustsImageWhenHighlighted UIButton屬性,以避免在按下按鈕時圖像出現奇怪的變形。

如果 UIButton 似乎沒有監聽布局約束設置,請檢查圖像是否大於按鈕大小。 對於視網膜分辨率,始終使用 @2x 和 @3x 圖像。

對於在 iOS 15 和 Xcode 13 上遇到此問題的任何人,請參閱Matt 在其他問題中的回答

Xcode 的行為發生了變化,現在將庫中的 UIButtons 默認為plain樣式,這會阻止子圖像按預期縮放。

為了解決這個問題,隨着時間的推移,我的方法變得有點棘手,我最終繼承了 UIButton 並覆蓋了 setHighlighted:

對我來說,只需將圖像 alpha 降低到 0.5 即可,因為它們位於黑色背景上。

然而,它只有在我注釋掉 [super setHighlighted:](它出現圖像拉伸代碼正在進行的地方)時才有效,這根本不是解決這個問題的正確方法......一切似乎都是不過,工作正常。 當我繼續努力時,我們將看到它的表現如何。

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

//    [super setHighlighted:highlight];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM