UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。

UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。,第1张

概述第一种:通过人为的办法改变view.transform的属性。 具体办法:     view.transform一般是View的旋转,拉伸移动等属性,类似view.layer.transform,区别在于 View.transform是二维的,也就是使用仿射的办法通常就是带有前缀CGAffineTransform的类(可以到API文档里面搜索这个前 缀的所有类),而view.layer.trans

第一种:通过人为的办法改变vIEw.transform的属性。

具体办法:

    vIEw.transform一般是VIEw的旋转,拉伸移动等属性,类似vIEw.layer.transform,区别在于 VIEw.transform是二维的,也就是使用仿射的办法通常就是带有前缀CGAffinetransform的类(可以到api文档里面搜索这个前 缀的所有类),而vIEw.layer.transform可以在3D模式下面的变化,通常使用的都是前缀为CAtransform3D的类。

    这里要记住一点,当你改变过一个vIEw.transform属性或者vIEw.layer.transform的时候需要恢复默认状态的话,记得先把他 们重置可以使用vIEw.transform = CGAffinetransformIDentity,或者vIEw.layer.transform = CAtransform3DIDentity,假设你一直不断的改变一个vIEw.transform的属性,而每次改变之前没有重置的话,你会发现后来 的改变和你想要的发生变化了,不是你真正想要的结果。

    好了,上面介绍了旋转的属性,接下来就是关键了。官方提供了一个办法就是查看当前电池条的状态UIInterfaceOrIEntation orIEntation = [UIApplication sharedApplication].statusbarOrIEntation;通过这个办法,你可以知道当前屏幕的电池条的显示方向,而且你还可以 强制设置他的显示方向,通过设置这个属性就OK了,可以选择是否动画改变电池条方向。有了这两个那我们就可以任意的改变我们想要的显示方式了。

1.获取当前电池条的方向UIInterfaceOrIEntation orIEntation = [UIApplication sharedApplication].statusbarOrIEntation

2.获取当前屏幕的大小CGRect frame = [UIScreen mainScreen].applicationFrame;

3.设置我们的VIEw的中心点
    CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.wIDth/2),frame.origin.y + ceil(frame.size.height/2));

4.根据当前电池条的方向,获取需要旋转的角度的大小。通常

if (orIEntation == UIInterfaceOrIEntationLandscapeleft) {
        return CGAffinetransformMakeRotation(M_PI*1.5);
    } else if (orIEntation == UIInterfaceOrIEntationLandscapeRight) {
        return CGAffinetransformMakeRotation(M_PI/2);
    } else if (orIEntation == UIInterfaceOrIEntationPortraitUpsIDeDown) {
        return CGAffinetransformMakeRotation(-M_PI);
    } else {
        return CGAffinetransformIDentity;
    }

5.可以动画的改变我们vIEw的显示方式了
[[UIApplication sharedApplication] setStatusbarOrIEntation:UIDeviceOrIEntationLandscapeRight animated:YES];

CGfloat duration = [UIApplication sharedApplication].statusbarOrIEntationAnimationDuration;(获取当前电池条动画改变的时间)
        [UIVIEw beginAnimations:nil context:nil];
        [UIVIEw setAnimationDuration:duration];

       //在这里设置vIEw.transform需要匹配的旋转角度的大小就可以了。

        [UIVIEw commitAnimations];

第二种:通过setorIEntation:的办法强制性的旋转到一个特定的方向。

    注意:Apple在3.0以后都不支持这个办法了,这个办法已经成为了私有的了,但是要跳过App Stroe的审核,需要一点巧妙的办法。

    不要直接调用[[UIDevice currentDevice] setorIEntation: UIInterfaceOrIEntationLandscapeRight]这样的办法来强制性的横屏,这样导致你的程序是很难通过App Store审核的。但是你可以选择使用performSelector的办法来调用它。具体就几行代码如下:

//强制横屏
    if ([[UIDevice currentDevice] respondsToSelector:@selector(setorIEntation:)]) {
        [[UIDevice currentDevice] performSelector:@selector(setorIEntation:)
                                       withObject:(ID)UIInterfaceOrIEntationLandscapeRight];
    }

    总结:如果第一种办法可以满足你需要的话,最好使用第一种办法,因为那个上 App Store肯定没问问题,但是第二种的话是需要冒风险的,但是如果你的结构太复杂了,导致使用第一种办法人为很难控制的话,可以尝试简单的使用第二种办 法。我在有米提供的sample里面就看到他使用了第二种简单的办法来显示横屏竖式的广告条。

 

 

ipad横竖屏切换解决方案

  由于ipad的横竖屏不同,所以好的应用,横竖屏的页面布局也不一样。那么就需要横竖屏的整体解决方案。先看一个横竖屏布局不一样的界面。

 

上面两张图是来自同一个界面的横竖版的截屏。可以看出,横竖版显示的内容相同,但是界面布局不同。要实现上述布局,主要是运用UIVIEw中 layoutSubvIEws方法。当UIVIEw设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubvIEws方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。

 

下面是实现上述界面的最简单的原型:

首先分析可以知道左面是图片,右面是一个图片加文字的视图。下面就实现一个左面视图右面是一个图加一段字的事例。

事例的截图如下:

 

 

其中右面的文字和绿色部分是用一个子视图封装的。 整个布局是我在主视图中添加了一个ContentVIEw视图,在ContentVIEw视图中添加了一个ArticleVIEw视图。 其中ArticleVIEw和ContentVIEw的xib文件都打开了

在ContentVIEw中重写layoutSubvIEws方法,然后根据stausbar的方向判断当前视图的横竖屏。具体代码:

-(voID)layoutSubvIEws{ 
    [super layoutSubvIEws]; 
    UIDeviceOrIEntation interfaceOrIEntation=[[UIApplication sharedApplication] statusbarOrIEntation]; 
    if (interfaceOrIEntation == UIDeviceOrIEntationPortrait || interfaceOrIEntation == UIDeviceOrIEntationPortraitUpsIDeDown) { 
        //翻转为竖屏时 
        [self setVerticalFrame]; 
    }else if (interfaceOrIEntation==UIDeviceOrIEntationLandscapeleft || interfaceOrIEntation == UIDeviceOrIEntationLandscapeRight) { 
        //翻转为横屏时 
        [self setHorizontalFrame]; 
    } 
}

-(voID)setVerticalFrame 

    NSLog(@"竖屏"); 
    [TitleLable setFrame:CGRectMake(283,239,83)]; 
    [leftVIEw setFrame:CGRectMake(38,102,384,272)]; 
    [rightVIEw setFrame:CGRectMake(450,282,198)]; 
}

-(voID)setHorizontalFrame 

    NSLog(@"横屏"); 
    [TitleLable setFrame:CGRectMake(183,83)]; 
    [leftVIEw setFrame:CGRectMake(168,122,272)]; 
    [rightVIEw setFrame:CGRectMake(650,198)]; 
}

在具体的横竖屏方法中,从新设置各个组件的坐标即可。

接下来在ContentVIEw中添加ArticleVIEw视图。

-(ID)initWithCoder:(NSCoder *)aDecoder 

    if ((self = [super initWithCoder:aDecoder])) {

        NSArray *arrayContentVIEw =[[NSBundle mainBundle] loadNibnamed:@"ArticleVIEw" owner:self options:nil]; 
        rightVIEw=[arrayContentVIEw objectAtIndex:0]; 
        [self addSubvIEw:rightVIEw]; 
    } 
    return self; 
}

由于我用的是xib,所以初始化方法为initWithCoder,在这个中添加新的视图。

同样在ArticleVIEw中设置横竖屏相应空间的坐标即可。


-(voID)layoutSubvIEws{ 
    [super layoutSubvIEws]; 
    UIDeviceOrIEntation interfaceOrIEntation=[[UIApplication sharedApplication] statusbarOrIEntation]; 
    CGRect rect=self.frame; 
    rect.size.wIDth=282; 
    rect.size.height=198; 
    [self setFrame:rect]; 
    if (interfaceOrIEntation == UIDeviceOrIEntationPortrait || interfaceOrIEntation == UIDeviceOrIEntationPortraitUpsIDeDown) { 
        //翻转为竖屏时 
        [self setVerticalFrame]; 
    }else if (interfaceOrIEntation==UIDeviceOrIEntationLandscapeleft || interfaceOrIEntation == UIDeviceOrIEntationLandscapeRight) { 
        //翻转为横屏时 
        [self setHorizontalFrame]; 
    } 
}

-(voID)setVerticalFrame 

    NSLog(@"竖屏"); 
    [contentVIEw setFrame:CGRectMake(12,6,250,125)]; 
    [textLable setFrame:CGRectMake(50,139,182,39)]; 
}

-(voID)setHorizontalFrame 

    NSLog(@"横屏"); 
    [contentVIEw setFrame:CGRectMake(12,106,158)]; 
    [textLable setFrame:CGRectMake(135,11,147,39)]; 
}

 

 

 

</pre> 需求:程序默认开启是横屏,在压到某个页面的时候是竖屏<p></p><p>< /p><p>1.默认横屏需要在XX-info.pList 的 Supported interface orIEntations 的第一项为 Landscape (left home button)</p><p>2.在切换的竖屏的时候< /p><p></p><pre name="code" class="cpp">-(voID)vIEwWillAppear:(BOol)animated   {       //[[UIApplication sharedApplication] setStatusbarOrIEntation:UIInterfaceOrIEntationPortrait];       UIInterfaceOrIEntation orIEntation = [UIApplication sharedApplication].statusbarOrIEntation;              if (orIEntation != UIInterfaceOrIEntationPortrait ||            orIEntation != UIInterfaceOrIEntationPortraitUpsIDeDown)       {           [[UIApplication sharedApplication] setStatusbarOrIEntation:UIInterfaceOrIEntationPortrait];                      //(获取当前电池条动画改变的时间           CGfloat duration = [UIApplication sharedApplication].statusbarOrIEntationAnimationDuration;           [UIVIEw beginAnimations:nil context:nil];           [UIVIEw setAnimationDuration:duration];                      //在这里设置vIEw.transform需要匹配的旋转角度的大小就可以了。           self.vIEw.transform = [self gettransformMakeRotationByOrIEntation:orIEntation];           [UIVIEw commitAnimations];       }                   }  

计算方向

view plain - (CGAffinetransform)gettransformMakeRotationByOrIEntation:(UIInterfaceOrIEntation)orIEntation   {       if (orIEntation == UIInterfaceOrIEntationLandscapeleft)        {           return CGAffinetransformMakeRotation(M_PI/2);       }        else if (orIEntation == UIInterfaceOrIEntationLandscapeRight)        {           return CGAffinetransformMakeRotation(M_PI/2);       }        else if (orIEntation == UIInterfaceOrIEntationPortraitUpsIDeDown)       {           return CGAffinetransformMakeRotation(-M_PI);       }        else        {                  }              return CGAffinetransformIDentity;          }  

 

3.返回的到竖屏

 

view plain - (voID)vIEwWilldisappear:(BOol)animated   {                 UIInterfaceOrIEntation orIEntation = [UIApplication sharedApplication].statusbarOrIEntation;              if (orIEntation != UIInterfaceOrIEntationLandscapeleft ||            orIEntation != UIInterfaceOrIEntationLandscapeRight)       {           [[UIApplication sharedApplication] setStatusbarOrIEntation:UIInterfaceOrIEntationLandscapeleft];                      //(获取当前电池条动画改变的时间           CGfloat duration = [UIApplication sharedApplication].statusbarOrIEntationAnimationDuration;           [UIVIEw beginAnimations:nil context:nil];           [UIVIEw setAnimationDuration:duration];                      self.vIEw.transform = CGAffinetransformIDentity;           [UIVIEw commitAnimations];       }     }  

 

 

iPad上的应用一般都会横竖屏支持,所以同一个界面页面的横竖布局也是不一样的。要实现横竖布局的不一样一般用到了UIVIEw的layoutSubVIEw方法。当UIVIEw设置为自动适配屏幕时,当用户设备旋转的时候,就会调用layoutSubVIEw这个方法,只要重写这个方法,然后判断屏幕的方向,调整控件的位址就可以了。现在大家可能会有些疑问,为什么不在UIVIEwController的这个方法:

- (voID)willAnimateRotationToInterfaceOrIEntation:(UIInterfaceOrIEntation)toInterfaceOrIEntation duration:(NSTimeInterval)duration 进行判断。因为这个方法是作用于UIVIEwController下的,而不是直接作用于UIVIEw进行控制,所以会发生延迟,作用的对象也不正确。所以建议用layoutSubVIEw这个方法   使用列子:  

-(voID)layoutSubvIEws{ 

    [super layoutSubvIEws]; 

    UIDeviceOrIEntation interfaceOrIEntation=[[UIApplication sharedApplication]statusbarOrIEntation]; 

    if (interfaceOrIEntation == UIDeviceOrIEntationPortrait || ==UIDeviceOrIEntationPortraitUpsIDeDown) { 

        //翻转为竖屏时 

        [self setVerticalFrame]; 

    }else interfaceOrIEntation==UIDeviceOrIEntationLandscapeleft ==UIDeviceOrIEntationLandscapeRight        //翻转为横屏时 

        [self setHorizontalFrame]; 

    } 

}

-(voID)setVerticalFrame 

    NSLog(@"竖屏"); 

    [TitleLable setFrame:CGRectMake(2830,214)">239,214)">83)]; 

    [leftVIEw 38,214)">102,214)">384,214)">272)]; 

    [rightVIEw 450,214)">282,214)">198)]; 

}

-(voID)setHorizontalFrame 

    横屏183,214)">168,214)">122,214)">650,214)">198)]; 

}

总结

以上是内存溢出为你收集整理的UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。全部内容,希望文章能够帮你解决UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1089404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存