`

view整体上移

    博客分类:
  • ios
 
阅读更多
如果你准备将你的老的 iOS 6 app 迁移到 iOS 7/8 上,那么你必须注意了。当你的老的 app 在 iOS 7 设备上运行时,所有ViewController 的视图都整体上移了,因为 iOS 7 把整个屏幕高度(包括状态栏和导航栏)都作为了视图控制器的有效高度。于是你的视图上移了,并和上层的状态栏交叠在一起。

你当然可以在 Xcode 中修改每个 View,将他们下移20个像素(状态栏高度)或者64个像素(状态栏+导航栏高度)。

但是苹果显然已经考虑到这个问题,他们在 iOS 7 SDK 中为 ViewController 提供了一个 edgesForExtendedLayout 新属性。如果你将这个属性设置为UIRectEdgeNone,则 viewController 的所有子视图都会自动调整,这样在 iOS 7 下看到的效果和 iOS 6 完全一样。

为了方便,你可以为 UIViewController 扩展一个子类,并覆盖它的 viewDidLoad 方法:

@implementation DerivedViewController

- (void)viewDidLoad

{

    [superviewDidLoad];

if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])

       self.edgesForExtendedLayout = UIRectEdgeNone;

}

@end

然后你以后所有的 ViewController 都从这个 DerivedViewController 类继承。

但不幸的是,我们的程序仍然有大量 iOS<7 的用户 ,我们无法立即抛弃对 iOS 6 的支持。无论 edgesForExtendedLayout 还是UIRectEdgeNone,都只能在 iOS7 下有效。对于 iOS 6,我将以上代码修改为:

- (void)viewDidLoad

{

    [superviewDidLoad];

#if__IPHONE_OS_VERSION_MAX_ALLOWED >= 70000

    if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])

       self.edgesForExtendedLayout = UIRectEdgeNone;

#else

    float barHeight =0;

    if (!isIPad()&& ![[UIApplication sharedApplication] isStatusBarHidden]) {

       barHeight+=([[UIApplication sharedApplication]statusBarFrame]).size.height;

    }

    if(self.navigationController &&!self.navigationController.navigationBarHidden) {

       barHeight+=self.navigationController.navigationBar.frame.size.height;

    }

    for (UIView *viewin self.view.subviews) {

      

       if ([view isKindOfClass:[UIScrollView class]]) {

           view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height - barHeight);

        } else {

           view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height);

       }

    }

#endif

}

通过宏 __IPHONE_OS_VERSION_MAX_ALLOWED 判断 deployment target 是否 >7.0。>7.0则使用新的 edgesForExtendedLayout API,负责使用比较笨的方法逐个下移 subviews,并自动根据状态栏/导航栏的可视状态计算要移动的偏移量。

注:如果已升级至Xcode5,将导航控制器的 Top Bar 设置为一种“Opacque ...”(不透明)类型可解决此问题。
分享到:
评论

相关推荐

    QGraphicsView(平移/缩放/旋转)

    为了启用平移,我们需要设置`QGraphicsView`的`dragMode`为`ScrollHandDrag`,这样用户就可以通过按下鼠标左键并拖动来移动视图。另外,可以使用`setTransformOriginPoint`设置旋转和平移的原点,通常选择场景中心...

    QGraphicsView以鼠标点实现放大缩小、拖拽

    在Qt框架中,`QGraphicsView`是一个强大的组件,用于显示和操作复杂的2D图形场景。本篇文章将详细讲解如何利用`QGraphicsView`来实现图像的放大、缩小和拖拽功能,这对于创建具有交互性的图形用户界面(GUI)特别...

    Android View的六种移动方式

    1. **offsetLeftAndRight(offsetX)**:这个方法用于水平方向上平移一个View。`offsetX`参数表示View需要移动的像素值。如果`offsetX`是正数,View会向右移动;反之,如果`offsetX`是负数,View会向左移动。此方法...

    QT 整理的Graphics View 的一些例子

    3. **QGraphicsView**: 它是图形视图,负责将Graphics Scene显示在窗口上。你可以调整QGraphicsView的缩放、平移等属性,以提供不同的查看体验。例如,设置`setDragMode()`可以允许用户通过鼠标拖动来平移视图,`...

    QT的graphicsview高级例程

    6. **视图变换(View Transformations)**: GraphicsView支持缩放、旋转和平移等视图变换。可以使用`scale()`, `rotate()`, `translate()`等方法来调整视图,以适应不同的查看需求。 7. **高性能渲染**: Qt的优化...

    Android软键盘手动显示、隐藏、布局上移和EditText上移Demo

    - 当软键盘弹出时,若希望布局整体上移,需在Activity的根布局使用`android:fitsSystemWindows="true"`,并结合`windowSoftInputMode="adjustResize"`,这样可以避免被键盘遮挡。 - 对于特定View(如EditText)...

    IOS开发中键盘输入屏幕上移的解决方法

    为了解决这个问题,开发者需要采取措施让屏幕随键盘的出现而上移,确保用户能方便地与界面元素交互。以下是一种实现这一功能的方法: 首先,为了监听UITextField的输入状态,我们需要遵循UITextFieldDelegate协议。...

    平移_计算机图形学平移_

    在计算机图形学中,平移(Translation)是一种基本的几何变换,它涉及到将物体或坐标系在三维空间中整体移动,而保持其形状和大小不变。这个过程在各种应用程序中非常常见,比如游戏开发、虚拟现实、CAD设计等。本...

    安卓Android源码——View中添加Animation.zip

    3. **应用动画**:调用View的`startAnimation()`方法,将动画应用到特定的View上。 四、源码分析 资源包中的"源码说明.txt"可能包含对如何在代码中实现上述步骤的详细解释,而"Android View中添加Animation"可能是...

    QT 缩放以及还原原始大小

    在QT中,QGraphicsView是一个关键组件,用于展示复杂的2D图形场景,包括图像、对象和动画。当我们处理图形视图时,缩放功能是必不可少的,它允许用户以不同比例查看和操作场景内容。本篇文章将深入探讨如何在...

    GaussView高级技巧.pdf

    为了更好地控制变形过程,GaussView还提供了三种不同的原子移动模式:“平移全组”、“平移原子”和“固定”。 - **平移全组**:选择该模式后,所有选中的原子将作为一个整体进行移动。 - **平移原子**:此模式允许...

    自定义view loading效果

    我们可以通过`ObjectAnimator`或`ValueAnimator`来创建动画,改变图形的位置、大小、颜色等属性,从而实现旋转、缩放、平移等效果。 在描述中提到的“LoadingPopPoint”可能是指一种特定的loading效果,比如点状...

    SmartImageView框架.zip

    对于不同分辨率的设备,SmartImageView能自动处理图片缩放,确保图片在各种屏幕尺寸上都能正确显示。 通过使用SmartImageView框架,开发者能够轻松处理Android应用中的图片加载问题,提升应用的性能和用户体验。...

    android 自定义View动画全集

    滤镜效果则利用Shader类来实现,如BitmapShader可以将图片作为纹理应用到自定义View上,ColorFilter可以让颜色产生各种变化,例如灰度、饱和度调整等。同时,可以通过BlurMaskFilter或BoxBlur算法实现模糊效果,增强...

    Qt QGraphics导入背景图并绘制图形,画布移动、缩放、图形旋转等

    使用Qt QGraphic实现一个应用场景,直接导入背景图,并在背景画布上绘制几何图形,包括矩形、圆形等,支持画布整体移动、放大和缩小,画布恢复,图形item选中、移动、旋转。item移动 会实时显示全局坐标以及相对于...

    android基础动画平移,缩放,透明渐变,滚动

    滚动动画并不直接由一个特定的类提供,而是通过`ViewFlipper`、`ViewAnimator`等视图容器的动画方法实现,或者通过自定义`View`和`onDraw()`方法配合`postInvalidate()`来实现。滚动动画可以用来在多个视图之间切换...

    uni-app自定义uni-popup弹窗内容

    自定义uni-popup内容,包含picker-view组件,前提基础需要运行在uni-app项目之下,且已保证插入外置组件,根据传入的list数据渲染选择列表,且能回填数据 组件调用 :valueKey="'value'" /&gt;

    Android解决软键盘弹起时遮住登录按钮的问题

    本文将详细介绍如何解决这一问题,实现软键盘弹出时页面整体上移,以及点击空白区域收起软键盘的效果,并且将11位手机号格式化为xxx xxxx xxxx的显示形式。 首先,要让页面整体上移,我们需要在`AndroidManifest....

    Android 积分签到动画 位移+透明 Android签到动画效果 签到上移消失动画效果

    "Android积分签到动画 位移+透明 Android签到动画效果 签到上移消失动画效果"这个主题涉及到的是如何实现一个具有吸引力和交互性的签到功能,特别是签到完成后,积分展示区域通过位移和透明度变化逐渐消失的动画效果...

    Android View的绘制高级篇 二(饼状图,三角图)

    饼状图是一种常用的表示比例或部分与整体关系的数据可视化方式。在Android中,我们可以通过自定义View类来实现饼状图的绘制。首先,我们需要了解`onDraw()`方法,这是View绘图的核心,它会在每次View需要更新时被...

Global site tag (gtag.js) - Google Analytics