簡體   English   中英

當UIButton內容模式為“中心”時,背景圖像會像素化

[英]When UIButton content mode is “center,” background image is pixelated

這是我如何設置背景圖像和內容模式:

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
               forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];

是否有背景圖像像素化的原因? 框架略大於圖像尺寸,我只想讓圖像居中。

我猜UIButton不認為背景圖像是“內容”,因此內容模式不適用於背景圖像。 相反,我設置按鈕的圖像,它工作得很好:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];

在xib / storyboard中的Attributes檢查器中,您需要:

  1. 將您的UIButton類型設置為Custom
  2. 設置你的形象在物業Image ,而不是Background
  3. 驗證步驟2,您可以看到根據圖像集更改了按鈕框。 根據需要設置框架,圖像將自行調整大小以適應
  4. 為屬性Edge選擇Image ,以便將插入應用於按鈕圖像
  5. 輸入您需要的插入值。 如果將5設置為“ Top, Bottom, Left, Right ,則圖像將在按鈕內居中,邊框為5

您可以在xib / storyboard視圖中看到更改,無需啟動調試。

提示:按鈕的每個圖像的插入都是相同的( State Config

您還可以實現- (CGRect)backgroundRectForBounds:(CGRect)bounds來控制如何繪制背景。

正確的解決方案是將類型從“系統”更改為“自定義”。 然后,背景圖像將遵循內容類型而不僅僅是居中。 在我的情況下,我將其設置為Aspect Fill並應用45度角半徑來圍繞它。 簡單而且完美。

我需要為頭像照片創建圓形按鈕,並找到這個問題的答案,但他們沒有讓我一路走來。 我實現了backgroundRectForBounds方法並縮放圖像以適應它並且效果很好。

我在GitHub上有代碼。

https://github.com/brennanMKE/CircleButton

該方法也列在下面。 設置背景圖像非常重要,而不是使用此方法無法使用的按鈕的圖像。

- (CGRect)backgroundRectForBounds:(CGRect)bounds {
    UIImage *backgroundImage = [self backgroundImageForState:self.state];
    if (backgroundImage) {
        CGFloat maxWidth = CGRectGetWidth(self.frame);

        CGFloat xDelta = maxWidth / backgroundImage.size.width;
        CGFloat yDelta = maxWidth / backgroundImage.size.height;
        CGFloat delta = xDelta > yDelta ? xDelta : yDelta;

        CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta)) / 2);
        CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta)) / 2);

        return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta);
    }
    else {
        return [super backgroundRectForBounds:bounds];
    }
}

暫無
暫無

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

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