2014-11-21 141 views
19

如何使用尺寸等級唯一識別iPhone 6和iPhone 6以及肖像屏幕?尺寸等級識別iPhone 6和iPhone 6以及肖像

我的應用程序在iPhone 4和iPhone 5中看起來不錯,但由於屏幕尺寸的原因,iPhone 6和iPhone 6中的空白空間相同。雖然我使用自動佈局,但我無法僅爲iPhone 6和6加上字體大小或視圖大小。我知道我們可以使用大小類來更改字體大小和視圖大小。但在我的情況下,不知道該怎麼辦。

我使用的是xCode 6.1,我的應用程序支持從iOS 7到最新的iOS 8.1。我期待只在故事板中的解決方案,因爲我正在故事板中充分執行我的UI設計。如果故事板的功能有限以實現我的需求,請讓我知道如何通過應用程序實現與代碼相同的功能?

+0

這都是儘可能相同尺寸等級和設備類型。如果您正在自動佈局,視圖大小會隨着屏幕比例的變化而改變。你能顯示爲什麼你需要不同的字體大小的屏幕截圖? – matt 2014-11-21 16:31:03

+0

@matt你可以在這裏看到iPhone 6以上的文件。由於NDA我不能分享真正的版本。我只需要在每個標籤之間留有空白,我確實有一些控制權。 https://www.dropbox.com/s/ycar93s6j8djv33/Screen%20Shot%202014-11-22%20at%2012.51.44%20AM.png?dl=0 – Bluewings 2014-11-21 16:56:25

+0

感謝您的屏幕截圖,但是您認爲是什麼它有錯嗎? – matt 2014-11-21 17:02:05

回答

24

根據iPhone類型調整字體大小的另一種方法是使用「用戶定義的運行屬性」。

定義一個擴展的UILabel:

extension UILabel { 
    var adjustFontToRealIPhoneSize: Bool { 
     set { 
      if newValue { 
       var currentFont = self.font 
       var sizeScale: CGFloat = 1 
       let model = UIDevice.CurrentDevice().modelName() 

       if model == "iPhone 6" { 
        sizeScale = 1.3 
       } 
       else if model == "iPhone 6 Plus" { 
        sizeScale = 1.5 
       } 

       self.font = currentFont.fontWithSize(currentFont.pointSize * sizeScale) 
      } 
     } 

     get { 
      return false 
     } 
    } 
} 

爲了確定當前的型號名稱,請參考以下答案:https://stackoverflow.com/a/26962452/4165128

在故事板,選擇要調整標籤,打開右窗格,選擇身份檢查器,並將「adjustFontToRealIPhoneSize」屬性添加到用戶定義的運行時屬性列表(類型爲「布爾」,並選中複選框)。

對你想調整的每個標籤都做同樣的事情(複製&粘貼令人驚訝地在這裏工作)。

+5

您可以將@IBInspectable添加到該擴展,然後您可以直接從Attributes Inspector編輯它。 – 2015-02-06 09:23:33

+0

有人可以提供它的Objective-C版本嗎? – 2015-09-03 10:52:34

+1

我不認爲確切的模型是針對多尺寸設備的(甚至是預期的)方式。 – Jonny 2016-08-22 02:36:39

2

查看adjustsFontSizeToFitWidth @UILabel Class Reference。這將允許你根據不同的設備做一些很好的調整。

label.adjustsFontSizeToFitWidth = YES; 
7

使用緊湊型的寬度和常規高度在故事板

Use Compact width and Regular Height in storyboard

通過添加乘法器添加HIGHT和相對寬度與超級視圖的佈局約束。 比方說,你有圖像視圖的大小超過一半的觀點,然後添加乘數0.5。

enter image description here

+0

你能請在乘數上多說明一下,或給出一些鏈接來閱讀有關它? – Bluewings 2014-11-21 16:35:12

+0

截至目前爲止,我已經設置了圖像中提到的尺寸級別,但對於iPhone 6加上我的字體看起來太小 – Bluewings 2014-11-21 16:36:42

+0

但我的問題是與字體大小和其他控件之間的差距,假設我有一個標籤和文本字段的差距爲10,它在較小的屏幕中看起來不錯,但是在較大的屏幕中,它會像一樣,所以我可以看到很多空的空間。如何識別和更改字體大小和控件之間的差距? – Bluewings 2014-11-21 16:47:18

1

也許你可以設置完美的字體大小大屏幕,然後設置Autoshrinkminimum font size與小屏幕完美的大小,這樣,你就可以有一個動態的字體大小無需編碼。

您必須設置標籤的約束條件,以便隨屏幕大小調整其大小。

希望這有助於

+0

但是,如果文本包裝(多行),autoshrink不起作用。 – matt 2014-11-21 16:48:59

+0

如果是多行標籤,那麼解決方案可能需要一些代碼。如果沒有,那麼我認爲這是一個很好的選擇 – 2014-11-21 16:56:09

0

根據您的屏幕截圖,我會建議使用動態類型。這樣用戶負責文本的大小。

+0

所以,你的意思是說,作爲一名開發人員,我不需要關心字體大小和控件之間的差距。所以我的應用程序會在大屏幕上看到很多空白,並且肯定會影響用戶體驗。 – Bluewings 2014-11-21 17:07:12

+0

爲什麼要有「很多的差距」?這是自動佈局照顧。 – matt 2014-11-21 17:52:04

1

經過努力找到了一些我需要的東西,所以發佈相同的未來的讀者。

  1. 截至目前,沒有辦法使用Size類來唯一標識iPhone 6模型肖像。但是你可以用緊湊的寬度,並定期高度設計爲所有iPhone肖像屏幕
  2. 要更改字體大小,你必須確定哪些iPhone目前使用的代碼運行的應用程序,並設置基於相同
  3. 字體大小的我要求 - 所有屏幕尺寸的佈局相同 - 在寬度和高度約束中使用乘數。查看Jignesh對此問題的回答,以瞭解更多信息。

編輯24-SEP-2015 我最近發現了一種通過UITraitColleection只爲iPhone 6加,這樣你就不需要寫很多代碼來定製你的級別大小。我希望這個link將在未來幫助某人。

+0

但是,如果我們也想支持iPhones的橫向模式,使用'UITraitColleection'的方式將無濟於事。 – nickcheng 2016-06-17 06:45:15

2

對於不同的iPhone設備的不同字體大小,我沒有太多的sizeClass的想法,但我想出了這個解決方案。

  1. 將此方法添加到您的實用課程中。
  2. 只需將您的超級視圖傳遞給此方法,此方法是遞歸的,因此如果您傳遞self.view而不是所有子視圖都設置。
  3. 根據需要更改字體大小。
-(void)setAllFonts:(UIView *)view 
{ 

CGFloat fontSizeDiff = 0.0; 

if (IS_IPHONE_6) 
{ 
    fontSizeDiff = 1; 
} 
else if (IS_IPHONE_6PLUS) 
{ 
    fontSizeDiff = 2; 
} 

for (UIView *vw in [view subviews]) 
{ 
    if ([vw isKindOfClass:[UILabel class]] || [vw isKindOfClass:[UIButton class]]) 
    { 
     if ([vw isKindOfClass:[UILabel class]]) 
     { 
      UIFont *font = [(UILabel *)vw font]; 
      [(UILabel *)vw setFont:[UIFont fontWithName:font.fontName size:font.pointSize+fontSizeDiff]]; 
     } 
     else 
     { 
      UIFont *font = [(UIButton *)vw titleLabel].font; 
      [(UIButton *)vw titleLabel].font = [UIFont fontWithName:font.fontName size:font.pointSize+fontSizeDiff]; 
     } 
    } 
    else if ([vw isKindOfClass:[UIView class]] || [vw isKindOfClass:[UIScrollView class]]) 
    { 
     [self setAllFonts:vw]; 
    } 
} 
} 
+0

「對於不同的iPhone設備中不同字體大小的sizeClass,我沒有太多的想法......」這是你應該停下來的地方,並且學習如何使用大小類而不是放入黑客。這個代碼如何處理iPhone 7,8,iPad Pro等? – 2016-12-01 13:30:12

1

有點晚,但我需要一個標籤,將擴展到所有的設備和使用這種方法。

創建的UILabel,並在把這個.h文件中一個新的子類...

#import <UIKit/UIKit.h> 

IB_DESIGNABLE 

@interface OTHD_ScalableLabel : UILabel 

@property (nonatomic, assign) IBInspectable CGFloat fontScale; 

@end 

,並把這個.m文件...

#import "OTHD_ScalableLabel.h" 

@implementation OTHD_ScalableLabel 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    if(self.fontScale < 0.1 || self.fontScale > 1.0)  self.fontScale = 1.0; 

    CGFloat height = CGRectGetHeight(self.bounds) * self.fontScale; 

    if(height)  self.font = [UIFont fontWithName:self.font.fontName size:height]; 
} 


@end 

然後,您可以只改變你的類IB和使用IBInspectable,您將能夠向上或向下縮放標籤。顯然,對於那裏的學生來說,這不是一個普遍使用的好主意,但是在某些情況下,您可能需要使用一個大型標籤,這些標籤可以在iPhone上全屏顯示,也可以在iPad上顯示全屏。 @iBhaviks的

2

夫特版回答:

func getFontScaleForDevice() -> CGFloat { 
    var sizeScale = CGFloat(1.0) 
    if DeviceType.IS_IPHONE_6 { 
     sizeScale = 1.2 
    } else if DeviceType.IS_IPHONE_6P { 
     sizeScale = 1.4 
    } else if DeviceType.IS_IPAD { 
     sizeScale = 1.4 
    } 
    return sizeScale 
} 

func setAllFonts(targetView:UIView, scale:CGFloat) { 
    for vw in targetView.subviews { 
     if let vl = vw as? UILabel { 
      vl.font = vl.font.fontWithSize(round(vl.font.pointSize * scale)) 
     } else if let vb = vw as? UIButton, vbl = vb.titleLabel { 
      vbl.font = vbl.font.fontWithSize(vbl.font.pointSize * scale) 
     } else if vw.subviews.count > 0 { 
      setAllFonts(vw, scale: scale) 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let sizeScale = getFontScaleForDevice() 
    if sizeScale > CGFloat(1.0) { 
     setAllFonts(view, scale: sizeScale) 
    } 
    view.layoutIfNeeded() 
} 
+0

請不要鼓勵與特定型號進行比較。此代碼將在一年內破解。學習如何正確使用蘋果預期的大小類。 – 2016-12-01 13:27:53

1

這裏是我在運行時使用之間的兩個不同的字體大小來切換的功能的一個例子。它根據水平尺寸等級決定使用哪種字體 - 它基本上將設備分成兩組「iPad」和「iPhone」。這裏是界河設備良好的refernce同屬尺寸類,其中:http://useyourloaf.com/blog/size-classes/

  • iPad和最多
  • iPhone Plus和向下
func chooseFont(compactFont: UIFont, regularFont: UIFont) -> UIFont { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.window!.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.compact ? compactFont : regularFont 
} 
相關問題