DcPaul
DcPaul
  • 发布:2021-03-16 14:40
  • 更新:2024-01-25 18:28
  • 阅读:3314

在横竖屏切换后 页面错乱问题的解决办法

分类:uni-app

需求:用户来到首页时候是竖屏的,点开详情页横屏展示详细信息,用户点击返回回到首页
问题:从横屏到竖屏或者竖屏到横屏都有可能出现页面错乱的问题,且还容易闪退!
原因:
因为页面使用rpx为单位的;如果用的是px为单位就不会;因为rpx是根据屏幕尺寸来计算的,回到首页时候,页面获取到的屏幕尺寸还是横屏的尺寸;
测试:
home.vue:

onShow(){  
            uni.getSystemInfo({  
                success: (res) => {  
                    uni.showModal({  
                        title:"sW:"+res.screenWidth+';sh:'+res.screenHeight+';ww:'+res.windowWidth+';wh:'+res.windowHeight  
                    })  
                }  
            })  
}

detail.vue:

methods: {  
            go_home(){  
                uni.showTabBar();  
                // #ifdef APP-PLUS  
                plus.screen.unlockOrientation(); //解除锁定屏幕方向  
                plus.screen.lockOrientation('portrait-primary');   
                // #endif  
                uni.reLaunch({  
                    url:"../index/index"  
                })  
            },

首次进入首页弹窗内容如下:

sw:393;sh:857;ww:393;wh:807

进入详情页 点击首页后弹窗内容如下

sw:873;sh:393;ww:873;wh:343

很明显系统提前获取了错误的页面尺寸;

解决办法就呼之欲出了,我只需要保证在首页时候拿到正常的屏幕尺寸:
detail.vue

methods: {  
            go_home_real(){  
                uni.getSystemInfo({  
                    success: (res) => {  
                        if(res.screenWidth <= res.screenWidth) {  
                            clearInterval(this.dingshiqi)  
                            uni.reLaunch({  
                                url:"../index/index"  
                            })  
                        }  
                    }  
                })  
            },  
            go_home(){  
                uni.showTabBar();  
                // #ifdef APP-PLUS  
                plus.screen.unlockOrientation(); //解除锁定屏幕方向  
                plus.screen.lockOrientation('portrait-primary');   
                // #endif  
                this.dingshiqi = setInterval(this.go_home_real,300);//每隔0.3秒检测一次屏幕是否已经竖过来了 如果是就跳转  

            },  
}

跳转时候做个检测
屏幕尺寸改变时候会触发onResize 也可以在这上面作文章;

data() {  
    return {  
        portraitUrl:'',  
        landScapeUrl:'',  
    }  
},  
onResize() {  
    let _this = this  
    uni.getSystemInfo({    
        success: function(res) {      
            if (res.windowWidth > res.windowHeight) {  
                if(_this.landScapeUrl) {  
                    uni.reLaunch({  
                        url:_this.landScapeUrl  
                    })  
                }  
            } else {    
               if(_this.portraitUrl) {  
                    uni.reLaunch({  
                        url:_this.portraitUrl  
                    })  
               }  
            }    
        }    
    })  
},  
methods: {  
    go_home(){  
        uni.showTabBar();  
        this.portraitUrl = '../index/index';  
        console.log("go_home")  
        // #ifdef APP-PLUS  
        plus.screen.unlockOrientation(); //解除锁定屏幕方向  
        plus.screen.lockOrientation('portrait-primary');   
        // #endif  
        console.log("go_home_end")        
    },  
}
2 关注 分享
7***@qq.com h***@leleketang.com

要回复文章请先登录注册

1***@qq.com

1***@qq.com

厉害啊
2024-01-25 18:28
kmq116

kmq116

呼之欲出 不是那个意思
2023-02-02 10:23
h***@leleketang.com

h***@leleketang.com

回复 DcPaul :
这个有解决办法了么
2021-07-18 17:04
DcPaul

DcPaul (作者)

回复 老王Plus :
受教了;但是今天发现这个竖屏转横屏的问题还是会出现样式错乱,已经确定来到新页面的尺寸是竖屏尺寸了 但是显示依然是按照横屏布局的,彻底凌乱了
2021-04-04 18:46
老王Plus

老王Plus

onResize有个参数,可以返回屏幕方向。
onResize: function(e) {
console.log(JSON.stringify(e));
}
会返回{"deviceOrientation":"landscape","size":{"windowWidth":896,"windowHeight":414}}
2021-03-31 17:06