使用 CGRectZero 初始化 UIView 的帧



我找到了一个关于如何用Swift编写的教程。我在一个Objective-C项目的尾部,我已经尝试过将类导入Objective-C,但这是一个充满bug的,时间垄断的灾难,所以我从Swift翻译到Objective-C代替。

我得到了UIView.h/m到没有警告/错误的地步,但是添加UIViewController的视图是另一回事。我已经发布了我试图"翻译"下面的初始化代码。

Swift类中初始化UIView的代码:
var parentFrame :CGRect = CGRectZero
override init(frame: CGRect) {
    super.init(frame: frame)
    backgroundColor = Colors.clear
}

代码从我的"翻译"Objective-C类初始化UIView

myUIView.h

// At MartinR's suggestion, I removed the pointer here
@property (nonatomic) CGRect parentFrame;

myUIView.m

// No compiler errors -- the errors occur on the UIViewController
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:(self.parentFrame)];
    self.parentFrame = CGRectZero;
    if (self) {
        [super setFrame:self.parentFrame];
        self.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

问题发生时,我试图将UIView添加到UIViewController。我不明白为什么我在下面得到警告:

Swift UIViewController代码添加UIView

  func addHolderView() {
    let boxSize: CGFloat = 75.0
    holderView.frame = CGRect(x: view.bounds.width / 2 - boxSize / 2,
                              y: view.bounds.height / 2 - boxSize / 2,
                              width: boxSize,
                              height: boxSize)
    holderView.parentFrame = view.frame
    holderView.delegate = self
    view.addSubview(holderView)
    holderView.addOval()
  }

我的"翻译"Objective-C ViewController充满了实现错误

myUIViewController.h

#import "HolderView.h"
// blah blah
@property (nonatomic, strong) HolderView *holderView;

myUIViewController.m

- (void)addHolderView {
    CGFloat boxSize = 75.0;
// WARNING: The following line says "expression result unused"
    [self.holderView initWithFrame:CGRectMake(_view.bounds.size.width / 2 - boxSize / 2,
                                              _view.bounds.size.height / 2 - boxSize / 2,
                                              boxSize,
                                              boxSize)];
    // Warning here went away by removing the pointer on CGRect parentFrame
    self.holderView.parentFrame = view.frame;
    self.holderView.delegate = self; // I have the delegate stuff squared away
    [self.view addSubview:self.holderView];
}

感谢您的阅读。

更新以反映MartinR在注释中的输入

我更新了上面的代码,删除了CGRect parentFrame上的指针。

Swift版本的addHolderView正在使用已经存在的holderView并更新它。你要么尝试重新初始化存在的东西要么初始化没有被分配的东西。很难知道是哪个,但两个都不是好主意。

要模仿原始代码,只需分配一个新的帧大小,而不需要init。要确定发生了什么,请使用调试器或NSLog语句检查self.holderView是否指向有效对象。

最新更新