如何在 Swift 2.0 中获得正确的 UIView 大小或边界?

Posted

技术标签:

【中文标题】如何在 Swift 2.0 中获得正确的 UIView 大小或边界?【英文标题】:How to get correct size or bounds of UIView in Swift 2.0? 【发布时间】:2016-07-19 08:18:02 【问题描述】:

您好,我无法将渐变颜色应用到我的UIView。它正确应用,但颜色边界因水平和纵向方向而异

如果我在纵向方向上正确设置,那么当我将设备翻转到水平方向时,渐变视图的边界不会改变。

那么,如何为水平和纵向设备方向获得正确的约束和UIView 的大小?

非常感谢您的帮助!!!

我尝试过的代码:

import UIKit

class ViewController: UIViewController 


    @IBOutlet var viewBar: UIView!


    override func viewDidLoad() 
        super.viewDidLoad()

        viewBar.layer.shadowOpacity = 0.5
        viewBar.layer.shadowOffset = CGSize(width: 3.0, height:2.0)
        viewBar.layer.shadowRadius = 5.0
        viewBar.layer.shadowColor = UIColor.blueColor().CGColor

        let gradient: CAGradientLayer = CAGradientLayer()

        gradient.colors = [UIColor.blueColor().CGColor, UIColor.redColor().CGColor]
        gradient.locations = [0.0 , 1.0]
        gradient.startPoint = CGPoint(x: 0.0, y: 1.0)
        gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
        gradient.frame.size = self.viewBar.bounds.size

        self.viewBar.layer.insertSublayer(gradient, atIndex: 0)

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()

    



编码输出:

【问题讨论】:

【参考方案1】:

viewDidLoad 中,布局尚未发生,因此您输入了错误的框架,请将gradient.frame.size = self.viewBar.bounds.size 移动到viewDidLayoutSubviews:viewWillAppear:,以便您的gradient 获得正确的框架。

  override func viewDidLayoutSubviews() 
    gradient.frame.size = self.viewBar.bounds.size
  

【讨论】:

不工作..同样的输出来了......我也试试这个方法......gradient.frame = viewBar.frame gradient.frame = CGRect(x: 0, y: 0, width: viewBar.frame.width, height: viewBar.frame.height)谢谢你的帮助...... :) :) :D 您可以尝试在super.viewDidLoad()之后拨打self.view.setNeedLayout()self.view.layoutIfNeeded()再试一次 thankz 伙计,您的代码运行良好...如果 禁用尺码分类 非常感谢 :) 在这里很开心! :D 当我在super.viewDidLoad() 之后使用self.view.setNeedLayout()self.view.layoutIfNeeded() 时,如果我不禁用Size Calsses渐变应用整个UIView b> ...感谢您的帮助:) :D 很高兴为您提供帮助:d 您不需要禁用会影响其他手机布局的尺寸等级【参考方案2】:

使用此方法在 viewDidLayoutSubViews 中检查您的设备方向。

+(NSString*)checkDeviceOrientation

    NSString *deviceOrientation;

    if ([[UIDevice currentDevice]orientation]== UIInterfaceOrientationLandscapeLeft ) 

        deviceOrientation = @"landscape left mode";
    
    else if ([[UIDevice currentDevice]orientation]==UIInterfaceOrientationLandscapeRight)
        deviceOrientation = @"landscape right mode";
    
    else
        deviceOrientation = @"potrait mode";
    
    return deviceOrientation;

然后在 viewDidLayoutSubviews 像这样调用这个函数,

-(void)viewDidLayoutSubview

if(IS_PHONE4)
if([self.checkDeviceOrientation isEqualtoString;@"landscape right mode"])

   NSLog(@"Get your view size%@",self.view.frame.size.width);


if(IS_IPHONE5)
if([self.checkDeviceOrientation isEqualtoString;@"landscape right mode"])

   NSLog(@"Get your view size%@",self.view.frame.size.width);

.....


还记得把这些常量放在你想要的任何文件中。

#define IS_IPAD             (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE           (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE4          (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0f || IS_IPHONE && [[UIScreen mainScreen]bounds].size.width == 480.0f)
#define IS_IPHONE5          (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f || IS_IPHONE && [[UIScreen mainScreen]bounds].size.width == 568.0f)
#define IS_IPHONE6          (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0 || IS_IPHONE && [[UIScreen mainScreen]bounds].size.width == 667.0f)
#define IS_IPHONE6PLUS      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0 || IS_IPHONE && [[UIScreen mainScreen]bounds].size.width == 736.0f)
#define IS_RETINA           ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))

我不熟悉 Swift 代码,但希望对您有所帮助。

【讨论】:

这个问题被标记为“swift”。您的解决方案可能有价值,但不是以 OP 要求的语言编写的,因此它是题外话。请在 Swift 中提供答案。谢谢。 我知道,我不熟悉 swift。我只是想解释一下怎么做。一个用过swift和Objective C的人,很容易理解。 @WasimSafdar,哇,好人……我会很快做到的……非常感谢 :) @MohanSigh,请记得评价我的回答。 :) @WasimSafdar 是的,我已经给它打分了,但是堆栈问我至少有 15 名声望,因为我把利率放在答案上......所以当我达到 15 名时,我会这样做... :) :D

以上是关于如何在 Swift 2.0 中获得正确的 UIView 大小或边界?的主要内容,如果未能解决你的问题,请参考以下文章

使用 swiftyJSON 在 Swift 2.0 中解析 JSON 时获取空值

如何从 Swift 2.0 中获取子数组

在 Swift (2.0) 中正确处理 NSJSONSerialization (try catch)?

如何在 Swift 2.0 中使用完成按钮做数字键盘?

如何在 Swift 2.0 中的 TableView 中获取选中标记的项目

如何在 UITableViewCell swift 中获得正确的 UIView 宽度