2012-06-28 16 views

Odpowiedz

3

Nie wiem. Myślę, że musisz utworzyć obrazy swoich etykiet tekstowych (albo z góry w wybranym przez ciebie narzędziu graficznym, albo możesz je zaprogramować programowo w czasie wykonywania).

Jeśli chcesz zrobić to programowo, może to zrobić metoda podobna do poniższej. Tworzy obraz wyrównany do środka, używając tekstu, który go przekazuje, wykonując zawijanie wyrazów.

UITabBarItem *item = [self.tabBar.items objectAtIndex:0]; 
item.image = [self makeThumbnailFromText:@"Tab Bar One"]; 
item.title = nil; 

item = [self.tabBar.items objectAtIndex:1]; 
item.image = [self makeThumbnailFromText:@"Tab Bar Two"]; 
item.title = nil; 

Wykorzystuje małą metodę, która tworzy bitmapę poprzez renderowanie tekstu, który do niej trafia. Być może trzeba będzie rozejrzeć się za pomocą rozmiarów obrazów i rozmiarów czcionek, aby zoptymalizować obrazy kontrolerów paska kart.

- (UIImage *)makeThumbnailFromText:(NSString *)string { 
    // some variables that control the size of the image we create, what font to use, etc. 

    CGSize imageSize = CGSizeMake(60, 80); 
    CGFloat fontSize = 13.0; 
    NSString *fontName = @"Helvetica-Bold"; 
    UIFont *font = [UIFont fontWithName:fontName size:fontSize]; 
    CGFloat lineSpacing = fontSize * 1.2; 

    // set up the context and the font 

    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0); 
    NSDictionary *attributes = @{NSFontAttributeName: font}; 

    // some variables we use for figuring out the words in the string and how to arrange them on lines of text 

    NSArray <NSString *> *words = [string componentsSeparatedByString:@" "]; 
    NSMutableArray <NSDictionary *> *lines = [NSMutableArray array]; 
    NSString *lineThusFar; 
    CGSize sizeThusFar = CGSizeZero; 

    // let's figure out the lines by examining the size of the rendered text and seeing whether it fits or not and 
    // figure out where we should break our lines (as well as using that to figure out how to center the text) 

    for (NSString *word in words) { 
     NSString *currentLine = lineThusFar ? [NSString stringWithFormat:@"%@ %@", lineThusFar, word] : word; 
     CGSize size = [currentLine sizeWithAttributes: attributes]; 
     if (size.width > imageSize.width && lineThusFar) { 
      [lines addObject:@{@"text": lineThusFar, @"size": [NSValue valueWithCGSize: sizeThusFar]}]; 
      lineThusFar = word; 
      sizeThusFar = [word sizeWithAttributes: attributes]; 
     } else { 
      lineThusFar = currentLine; 
      sizeThusFar = size; 
     } 
    } 
    if (lineThusFar) { 
     [lines addObject:@{@"text": lineThusFar, @"size": [NSValue valueWithCGSize: sizeThusFar]}]; 
    } 

    // now write the lines of text we figured out above 

    CGFloat totalSize = (lines.count - 1) * lineSpacing + fontSize; 
    CGFloat topMargin = (imageSize.height - totalSize)/2.0; 

    for (NSInteger i = 0; i < lines.count; i++) { 
     CGFloat x = (imageSize.width - [lines[i][@"size"] CGSizeValue].width)/2.0; 
     CGFloat y = topMargin + i * lineSpacing; 
     [lines[i][@"text"] drawAtPoint:CGPointMake(x, y) withAttributes: attributes]; 
    } 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

w Swift, który może wyglądać następująco:

func makeThumbnailFromText(text: String) -> UIImage { 
    // some variables that control the size of the image we create, what font to use, etc. 

    struct LineOfText { 
     var string: String 
     var size: CGSize 
    } 

    let imageSize = CGSize(width: 60, height: 80) 
    let fontSize: CGFloat = 13.0 
    let fontName = "Helvetica-Bold" 
    let font = UIFont(name: fontName, size: fontSize)! 
    let lineSpacing = fontSize * 1.2 

    // set up the context and the font 

    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0) 
    let attributes = [NSFontAttributeName: font] 

    // some variables we use for figuring out the words in the string and how to arrange them on lines of text 

    let words = text.componentsSeparatedByString(" ") 
    var lines = [LineOfText]() 
    var lineThusFar: LineOfText? 

    // let's figure out the lines by examining the size of the rendered text and seeing whether it fits or not and 
    // figure out where we should break our lines (as well as using that to figure out how to center the text) 

    for word in words { 
     let currentLine = lineThusFar?.string == nil ? word : "\(lineThusFar!.string) \(word)" 
     let size = currentLine.sizeWithAttributes(attributes) 
     if size.width > imageSize.width && lineThusFar != nil { 
      lines.append(lineThusFar!) 
      lineThusFar = LineOfText(string: word, size: word.sizeWithAttributes(attributes)) 
     } else { 
      lineThusFar = LineOfText(string: currentLine, size: size) 
     } 
    } 
    if lineThusFar != nil { lines.append(lineThusFar!) } 

    // now write the lines of text we figured out above 

    let totalSize = CGFloat(lines.count - 1) * lineSpacing + fontSize 
    let topMargin = (imageSize.height - totalSize)/2.0 

    for (index, line) in lines.enumerate() { 
     let x = (imageSize.width - line.size.width)/2.0 
     let y = topMargin + CGFloat(index) * lineSpacing 
     line.string.drawAtPoint(CGPoint(x: x, y: y), withAttributes: attributes) 
    } 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return image 
} 

I

var item = tabBar.items![0] 
item.image = makeThumbnailFromText("Tab Bar One") 
item.title = nil; 

item = tabBar.items![1] 
item.image = makeThumbnailFromText("Tab Bar Two") 
item.title = nil; 
+0

ok, dzięki, myślę, że to jest to jedyny sposób zbyt ... – Pach

+0

@Pach zaktualizowałem moją odpowiedź z kodem można teoretycznie wykorzystać do tworzyć obrazy w czasie wykonywania. Prawdopodobnie łatwiej jest to zrobić w Photoshopie lub innym narzędziu, które chcesz. – Rob

+0

OK, dziękuję! spróbuję tego! – Pach

0

Dla szybkiej 3

// moim punkcie środkowym jest obraz tylko i pozostałe elementy paska zakładek to tylko tekst

let tabs = CustomTabBarController(); 
tabs.viewControllers = [ViewControllerOne(),ViewControllerTwo(),ViewControllerThree()] 

    let tabbar = tabs.tabBar; 
    tabbar.backgroundColor = UIColor.white 

    let tabOne = tabbar.items![0] 
    tabOne.title = "One" 

    let tabTwo = tabbar.items![1] 
    tabTwo.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0); 
    tabTwo.image = UIImage(named: "tab_icon.png") 

    let tabThree = tabbar.items![2] 
    tabThree.title = "Three" 

// iw moim CustomTabBarController

import UIKit 

class CustomTabBarController: UITabBarController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    UITabBar.appearance().tintColor = UIColor.black 
     UITabBarItem.appearance().titlePositionAdjustment = UIOffset(horizontal: 0, vertical: -15) 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    self.selectedIndex = 1; 
} 

override var selectedViewController: UIViewController? { 
    didSet { 

     guard let viewControllers = viewControllers else { 
      return 
     } 

     for viewController in viewControllers { 

      if viewController == selectedViewController { 

       let selected: [String: AnyObject] = 
        [NSFontAttributeName:fontForTimesRoman(withStyle: "bold", andFontsize: 12), 
        NSForegroundColorAttributeName: UIColor.black] 

       viewController.tabBarItem.setTitleTextAttributes(selected, for: .normal) 

      } else { 

       let normal: [String: AnyObject] = 
        [NSFontAttributeName: fontForTimesRoman(withStyle: "regular", andFontsize: 12), 
        NSForegroundColorAttributeName: UIColor.gray] 

       viewController.tabBarItem.setTitleTextAttributes(normal, for: .normal) 

       } 
      } 
     } 
    } 


    func fontForTimesRoman(withStyle style: String, andFontsize size: CGFloat) -> UIFont { 
if (style == "bold") { 
    return UIFont(name: "TimesNewRomanPS-BoldMT", size: size)! 
} 
else if(style == "italic"){ 
    return UIFont(name: "TimesNewRomanPS-ItalicMT", size: size)! 
} 
else{ 
    return UIFont(name: "TimesNewRomanPSMT", size: size)! 
    } 

    } 
    } 
Powiązane problemy