Mam UITabBar
, ale nie chcę ustawiać obrazów, które po prostu chcę ustawić tytuł, i chcę, aby ten tytuł był wyrównany w pionie. czy to możliwe?Czy możliwe jest usunięcie obrazów w UITabBarItem i wyrównanie w pionie tytułu
Dzięki
Mam UITabBar
, ale nie chcę ustawiać obrazów, które po prostu chcę ustawić tytuł, i chcę, aby ten tytuł był wyrównany w pionie. czy to możliwe?Czy możliwe jest usunięcie obrazów w UITabBarItem i wyrównanie w pionie tytułu
Dzięki
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;
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)!
}
}
}
ok, dzięki, myślę, że to jest to jedyny sposób zbyt ... – Pach
@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
OK, dziękuję! spróbuję tego! – Pach