相关疑难解决方法(0)

为UIView子类化的正确做法?

我正在研究一些基于UIView的自定义输入控件,我正在尝试确定设置视图的正确做法.当一个UIViewController的工作,这是相当简单的使用loadView和相关viewWill,viewDid方法,但是继承一个UIView的时候,我有最接近methosds是`awakeFromNib,drawRectlayoutSubviews.(我正在考虑设置和拆卸回调.)在我的情况下,我正在设置框架和内部视图layoutSubviews,但我没有在屏幕上看到任何内容.

确保我的视图具有我想要的正确高度和宽度的最佳方法是什么?(无论我是否使用autolayout,我的问题都适用,尽管可能有两个答案.)什么是正确的"最佳实践"?

cocoa-touch objective-c uiview ios

154
推荐指数
3
解决办法
7万
查看次数

何时释放相关对象?

我通过关联引用将对象B附加到对象A.对象B观察对象A到KVO的一些属性.

问题是对象B似乎对象A 之后被释放,这意味着它太迟了以将其自身移除为对象A的KVO观察者.我知道这是因为我得到了NSKVODeallocateBreak异常,然后EXEC_BAD_ACCESS在对象B的dealloc中崩溃.

有没有人知道为什么对象B在具有OBJC_ASSOCIATION_RETAIN的对象A之后被释放?解除分配后是否释放相关对象?他们是否被自动释放?有谁知道改变这种行为的方法?

我试图通过类别向类添加一些东西,所以我不能覆盖任何现有的方法(包括dealloc),而且我并不特别想要混乱.在对象A被释放之前,我需要一些方法来解除关联并释放对象B.

编辑 - 这是我正在努力工作的代码.如果在完全取消分配UIImageView之前释放了关联的对象,那么这一切都可以正常工作.我所看到的唯一解决方案是在我自己的dealloc方法中调整,并调回原来以调用它.但这真的很混乱.

ZSPropertyWatcher类的要点是KVO需要一个标准的回调方法,我不想替换UIImageView,以防它自己使用它.

的UIImageView + Loading.h

@interface UIImageView (ZSShowLoading)
@property (nonatomic)   BOOL    showLoadingSpinner;
@end
Run Code Online (Sandbox Code Playgroud)

的UIImageView + Loading.m

@implementation UIImageView (ZSShowLoading)

#define UIIMAGEVIEW_SPINNER_TAG 862353453
static char imageWatcherKey;
static char frameWatcherKey;

- (void)zsShowSpinner:(BOOL)show {
    if (show) {
        UIActivityIndicatorView *spinnerView = (UIActivityIndicatorView *)[self viewWithTag:UIIMAGEVIEW_SPINNER_TAG];
        if (!spinnerView) {
            spinnerView = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];
            spinnerView.tag = UIIMAGEVIEW_SPINNER_TAG;
            [self addSubview:spinnerView];
            [spinnerView startAnimating];
        }

        [spinnerView setEvenCenter:self.boundsCenter];
    } else {
        [[self viewWithTag:UIIMAGEVIEW_SPINNER_TAG] removeFromSuperview];
    }
}

- …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch objective-c

30
推荐指数
2
解决办法
1万
查看次数

如何检测swift ios xcode中何时更改UIView大小?

我正在使用UIScrollView中的CATiledLayer尝试一些东西.

不知何故,UIScrollView中UIView的大小变为大数.我需要找出导致此调整大小的确切原因.

有没有办法检测UIView的大小(帧,边界)或UIScrollView的contentSize何时调整大小?

我试过了

override var frame: CGRect {
    didSet {
        println("frame changed");
    }
}
Run Code Online (Sandbox Code Playgroud)

在UIView子类中,

但它只在应用程序启动时调用一次,但之后会调整UIView的大小.

cocoa-touch uiscrollview uiview ios swift

20
推荐指数
4
解决办法
3万
查看次数

如何观察NSView框架的变化?

我有一个NSView,如果框架改变我需要注意.

class CustomView: NSView {

    override var frame: NSRect {

        didSet {
            Swift.print("changed frame: \(self.frame)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果调整superView框架的大小,我只会得到这个"notifikation".

如果我在NSView类中执行类似的操作:

NotificationCenter.default.addObserver(forName:  Notification.Name(rawValue: "changeOwnSize"), object: nil, queue: nil) { notification in

          let newSize = NSSize(width: self.frame.width / 2, height: self.frame.height)
          self.setFrameSize(newSize)
}
Run Code Online (Sandbox Code Playgroud)

didSet功能根本没有反应.虽然框架大小已更改.谢谢你的建议.

macos frame nsview ios swift

2
推荐指数
1
解决办法
1418
查看次数

标签 统计

cocoa-touch ×3

ios ×3

objective-c ×2

swift ×2

uiview ×2

frame ×1

iphone ×1

macos ×1

nsview ×1

uiscrollview ×1