使用KVC設置tabbar調整位置遇到的問題
如果設置tabBarItem.image
的時候馍管,就是一張包括文字的圖片,如圖
我.png
結果就會偏上茁影,底下留白是文字的位置:
tabbar.png
此時可以繼承自
UITabBar
宙帝,重寫- (void)layoutSubviews
方法調整UITabBarButton
的y
位置達到正常顯示的效果。代碼如下
- (void)layoutSubviews
{
[super layoutSubviews];
// 遍歷所有的button
for (UIView *tabBarButton in self.subviews) {
// 如果不是UITabBarButton募闲, 直接跳過
if (![tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue;
// 根據索引調整位置
tabBarButton.mj_y = 7;
}
}
但是如果在NavigationController
的第三級界面起任一界面步脓,執(zhí)行
[self.navigationController popToRootViewControllerAnimated:YES];
會出現對tabbar中圖片的調整失效
了。
我的解決辦法是:
不使用KVC重寫方法調整位置浩螺,改變圖片的尺寸解決這個問題靴患,將圖片的高度調高。因為tabbar的高度固定要出,那么圖片高了蚁廓,文字的位置就會壓縮。
將圖片尺寸調高的代碼:
- (UIImage *)tabbarImage:(UIImage *)image
{
CGFloat addValue = 10.0;
// 開啟圖形上下文
UIGraphicsBeginImageContextWithOptions(CGSizeMake(image.size.width, image.size.height+addValue), NO, 0.0);
// 將圖片畫上去
[image drawInRect:CGRectMake(0, addValue, image.size.width, image.size.height)];
// 獲得圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 結束圖形上下文
UIGraphicsEndImageContext();
return newImage;
}
KVC還可以幫我修改Pod文件里的代碼
比如:
SDCycleScrollView
這個庫厨幻,placeholderImage
的contentMode
沒有公開修改相嵌,想要修改其contentMode
可以利用KVC找到backgroundImageView
進行修改
- (void)setPlaceholderImage:(UIImage *)placeholderImage
{
_placeholderImage = placeholderImage;
if (!self.backgroundImageView) {
UIImageView *bgImageView = [UIImageView new];
bgImageView.contentMode = UIViewContentModeScaleAspectFit;
[self insertSubview:bgImageView belowSubview:self.mainView];
self.backgroundImageView = bgImageView;
}
self.backgroundImageView.image = placeholderImage;
}
修改代碼
UIImageView *bgImageView = [self.cycleScrollView valueForKey:@"_backgroundImageView"];
bgImageView.contentMode = UIViewContentModeScaleAspectFill;