1、在 iOS7 上你需要在你 controllers 销毁之前,将 delegates and datasources 设置成 nil.否则你会有很多让人讨厌的''message sent to deallocated instance''异常
- (void)dealloc {
self.tableView.delegate =nil;
self.tableView.dataSource =nil;
}
2、使用 Storyboard 提供的 Unwind Segue 对于重写 back 按钮简直是便利至极,但是这样 swipe 的手势又有问题了.幸运的是有一个非常简单的办法来修复
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
- (void)setup {
// If we don't clip to bounds the toolbar draws a thin shadow on top
[self setClipsToBounds:YES];
if (![self toolbar]) {
[self setToolbar:[[UIToolbar alloc] initWithFrame:[self bounds]]];
// [[self toolbar] setBarStyle:UIBarStyleBlack];
[self.layer insertSublayer:[self.toolbar layer] atIndex:0];
}
}
4、相信很多人在 iOS 7 的适配过程中遇到了类似这样的问题,当你试图通过设置navigationBar.barTintColor 的时候,你陷入了一个两难的困境,我们当然希望 navBar 还是可以透出高斯模糊后的背景,但好像事与愿违。
通过上面的例子,我们想到是不是可以通过叠加一个半透明的CALayer,来改变navigationBar 的背景色,或者说提高背景色的明度?我们的假设是对的!我们只需要通过一些数学计算来调整色值,这样计算出来的叠加层的背景色和透明度可以使得叠加后的结果正好与预期的色值一致:https://github.com/allenhsu/CRNavigationController
- (void)setBarTintColor:(UIColor *)barTintColor {
[supersetBarTintColor:barTintColor];
if (self.colorLayer ==nil) {
self.colorLayer = [CALayerlayer];
self.colorLayer.opacity = 0.4f;
[self.layeraddSublayer:self.colorLayer];
}
CGFloat red, green, blue, alpha;
[barTintColorgetRed:&red green:&greenblue:&blue alpha:&alpha];
CGFloat opacity =0.4f;
CGFloat minVal = MIN(MIN(red, green), blue);
if ([self convertValue:minVal withOpacity:opacity] <0) {
opacity = [selfminOpacityForValue:minVal];
}
self.colorLayer.opacity = opacity;
red = [selfconvertValue:red withOpacity:opacity];
green = [selfconvertValue:green withOpacity:opacity];
blue = [selfconvertValue:blue withOpacity:opacity];
red =MAX(MIN(1.0, red),0);
green =MAX(MIN(1.0, green),0);
blue =MAX(MIN(1.0, blue),0);
self.colorLayer.backgroundColor = [UIColorcolorWithRed:red green:greenblue:blue alpha:alpha].CGColor;
}
- (CGFloat)minOpacityForValue:(CGFloat)value
{
return (0.4 -0.4 * value) / (0.6 * value +0.4);
}
- (CGFloat)convertValue:(CGFloat)value withOpacity:(CGFloat)opacity
{
return 0.4 * value / opacity +0.6 * value - 0.4 / opacity +0.4;
}
5、iOS7对Status Bar的修改简直是残酷至极,但是当你掌握了使用技巧,你就可以得心应手。当然,使用起来也没有想象中那么简单。为了通过编程的方式来指定ViewController 的 Status Bar Style,需要在程序的info.plist文件中,设置UIViewControllerBasedStatusBarAppearance键值为YES,当然它默认为YES(如果你没有添加或修改过这个键值的话,就没必要去添加了,而设为NO的作用就在于提供对隐藏StatusBar的支持,当然我下面要讲的这些也就失效了)。
1)、通过 -(UIStatusBarStyle)preferredStatusBarStyle{} 来对每个ViewController指定Status Bar Style;
2)、通过 [self setNeedsStatusBarAppearanceUpdate]; 手动刷新Status Bar Style;
3)、preferredStatusBarStyle的调用逻辑是从你当前ViewController Container Stack的底部 ViewController中读取。所以我们可以得出如下结论:
1.如果你 App的 rootViewController或者被 present出来的 ViewController类型是 UINavigationController,我们可能就不得不重写它一下了(MyNavigationController)。并在 MyNavigationController中实现:
- (UIStatusBarStyle)preferredStatusBarStyle {
return [[self.viewControllers lastObject] preferredStatusBarStyle];
}
2.如果是 UITabBarController,忽略它吧,基于上一步考虑他子集的结构。
3.如果是 UISplitViewController,我们也得处理一下(MySplitViewController):
- (UIStatusBarStyle)preferredStatusBarStyle
{
for (UIViewController *controller in self.viewControllers) {
if ([controller isKindOfClass:NSClassFromString(@"MyMasterViewController")]) {
return [controller preferredStatusBarStyle];// Contaion MyNavigationController
}elseif ([controller isKindOfClass:NSClassFromString(@"MyDetailViewController")]) {
...
}
}
return UIStatusBarStyleDefault;
}
6、用了Autolayout 后发现scrollView 的拖动失效了,可所有设置在以前是可执行的。这是因为Autolayout 的机制,在viewDidLoad 函数被执行后, Autolayout 会重新把contentSize 修改为符合屏幕大小的数值(也就是说,现在的contentSize 又适合了屏幕大小,并没有大于scrollView 本身的大小,当然也就不能滚动了)。解决办法就是重写viewDidAppear:(BOOL)animated 方法,在super 之后再修改contentSize 的值。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.scrollview.contentSize = CGSizeMake(320.0, 600.0);
}