開發過程中,發現titleview很難居中,通過各種嘗試終於找到了解決方法。
首先清楚你個概念:
-
leftBarButtonItem,導航條中左側button。
-
rightBarButtonItem,導航條中右側button。
-
titleview,不用介紹了吧,就是標題。
問題原因:
經過嘗試,發現titleview的起點位置和尺寸依賴於leftBarButtonItem和rightBarButtonItem的位置。
解決方案:
設置titleview之前,先初始化leftBarButtonItem和rightBarButtonItem的位置,然后根據leftBarButtonItem和rightBarButtonItem的位置來使titleview居中。
//以下使參考代碼。 //必須放在 leftBarButtonItem和rightBarButtonItem初始化之后調用 - (void)setDisplayCustomTitleText:(NSString*)text { // Init views with rects with height and y pos UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; // Use autoresizing to restrict the bounds to the area that the titleview allows titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; titleView.autoresizesSubviews = YES; titleView.backgroundColor = [UIColorclearColor]; UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; titleLabel.tag = kUIVIEWCONTROLLER_LABEL_TAG; titleLabel.backgroundColor = [UIColor clearColor]; titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:16]; titleLabel.textAlignment = UITextAlignmentCenter; titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; titleLabel.textColor = TC_CNavigationTitleColor; titleLabel.lineBreakMode = UILineBreakModeClip; titleLabel.textAlignment = UITextAlignmentCenter; titleLabel.autoresizingMask = titleView.autoresizingMask; CGRect leftViewbounds = self.navigationItem.leftBarButtonItem.customView.bounds; CGRect rightViewbounds = self.navigationItem.rightBarButtonItem.customView.bounds; CGRect frame; CGFloat maxWidth = leftViewbounds.size.width > rightViewbounds.size.width ? leftViewbounds.size.width : rightViewbounds.size.width; maxWidth += 15;//leftview 左右都有間隙,左邊是5像素,右邊是8像素,加2個像素的閥值 5 + 8 + 2 frame = titleLabel.frame; frame.size.width = 320 - maxWidth * 2; titleLabel.frame = frame; frame = titleView.frame; frame.size.width = 320 - maxWidth * 2; titleView.frame = frame; // Set the text titleLabel.text = text; // Add as the nav bar's titleview [titleView addSubview:titleLabel]; self.navigationItem.titleView = titleView; }