使用CGRectZero初始化UIView的框架

时间:2015-07-24 11:06:20

标签: objective-c swift uiview uiviewcontroller translate

我找到了一个关于如何做一些用Swift写的东西的教程。我在Objective-C项目的尾端,我尝试将这些类导入Objective-C,但that's been a bug-riddled, time monopolizing disaster,所以我从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上的指针。

1 个答案:

答案 0 :(得分:1)

Swift版addHolderView正在使用已存在的holderView并更新它。你要么试图重新启动存在的东西,要么初始化一些尚未分配的东西。很难知道哪一个,但任何一个都是个坏主意。

要模仿原始代码,只需指定一个没有init的新帧大小。要确定要进行的操作,请使用调试器或self.holderView语句检查NSLog是否指向有效对象。