【问题标题】:Changing a points actual size globally?全局更改点的实际大小?
【发布时间】:2021-06-17 16:49:00
【问题描述】:

有没有办法全局更改 iOS 应用的默认比例?对于“比例”,我的意思是如果有意义的话,点代表的物理尺寸。我不想对单个视图应用任何变换或缩放,我希望将其应用于全局或每个屏幕。

我曾尝试修改 UIView 的 nativeScalescale 属性,但似乎不可能。

示例

默认行为

默认情况下,宽度为 100 vs 宽度为 200 的正方形渲染如下:

目标

当指定宽度为 100 时,我希望正方形以两倍大小(点)呈现:

有没有办法做到这一点?

【问题讨论】:

  • 您为什么愿意实现这一目标?将宽度设置为 200 不是更容易吗?目的是什么?
  • 是的……为什么?也许您正在寻找约束?
  • 根本问题是跨平台应用程序(iOS、tvOS、Android、Android TV)中平台之间的缩放差异。为了能够共享代码,与 iOS 相比,tvOS 上的每个大小都需要成倍增加。与 Android 相比,Android TV 并非如此。和这个问题有关stackoverflow.com/questions/60745363/…
  • @aheze 不确定约束在这里有什么帮助,那么宽度不会改变吗?
  • 对于跨平台应用程序,我认为最好采用屏幕尺寸的方法。在变量中,您可以存储屏幕高度和宽度。然后使用屏幕百分比。例如,如果您希望按钮占据屏幕高度的 10%,则将其高度设置为 0.1*ScreenHeight。

标签: ios swift scale


【解决方案1】:

"默认情况下,宽度为 100 vs 宽度为 200 的正方形渲染如下:"

我认为它不会在您提供输入时起作用,但它会在您的屏幕范围的乘数上起作用。我无法发表评论,所以我分享作为答案。

看看这里我分享了一个简单的项目以了解它是如何工作的。

https://github.com/jatinfl15/ResizeScreenWise

在这里,我将内部视图方面分配给屏幕的width。内视图乘数分配0.2

【讨论】:

    【解决方案2】:

    我认为不可能将 CG 更改为使用 像素坐标 而不是 点坐标CALayer 有许多缩放和光栅化选项,但我认为它们不会满足您的需求。

    这是一个使用扩展的编程解决方案,因此您可以使用 CGRect() 样式:

    let rectInPixels = CGRect(pointsX: 50.0, y: 50.0, width: 100.0, height: 100.0)    
    

    结果:

    rectInPixels: (100.0, 100.0, 200.0, 200.0)
    

    唯一的区别是在创建矩形时使用“pointsX:”而不是“x:”。当然,您可以使用对您最有意义的任何参数名称。

    或者将矩形从点转换为像素:

    //Create a rect using Point coordinates
    let rectInPoints = CGRect(x: 50.0, y: 50.0, width: 100.0, height: 100.0)
    
    //Convert from Points to Pixel coordinates
    let rectInPixels = rectInPoints.pixelCoords
    

    结果:

    rectInPixels: (100.0, 100.0, 200.0, 200.0)
    

    当然,您可以为CGPoint 或任何其他数据类型进行类似的扩展。

    扩展名:

    public extension CGRect {
        init(fromPointCoords pointRect: CGRect) {
            let res = UIScreen.main.nativeScale
            self.init(x: pointRect.origin.x * res, y: pointRect.origin.y * res, width: pointRect.size.width * res, height: pointRect.size.height * res)
        }
    
        init(pointsX x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) {
            let rectPixels = CGRect(fromPointCoords: CGRect(x, y, width, height))
            self.init(origin: rectPixels.origin, size: rectPixels.size)
        }
    
        var pixelCoords:CGRect {
            get {
                return CGRect(fromPointCoords: self)
            }
            set(newValue) {}
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2015-07-15
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多