[英]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
按鈕本身,你要設置contentHorizontalAlignment
和contentVerticalAlignment
性能和(關鍵)的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 和你想要的所有可愛的內容模式設置,然后在它上面放置一個自定義按鈕。 愚蠢的是你不能一次完成所有的事情,但看起來你不能。
找到了解決方法。 將UIButton
的adjustsImageWhenHighlighted
屬性設置為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;
}
唯一對我有用的解決方案:
[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.