この方法を使用するだけです:
UIView* view2 = [view1 copy]; // view1 existed
これにより、シミュレータがこのアプリを起動できなくなります。
保持してみて、
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
view2
への変更はview1
に適用され、view2
はview1
と同じメモリを共有することを理解しています。
UIView
をコピーできないのはなぜですか?理由は何ですか?
あなたのアプリはおそらく次のようなものでクラッシュします:
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
その理由は、UIViewはコピープロトコルを実装していないため、UIViewにはcopyWithZone
セレクターがないためです。
これはあなたのために働くかもしれません...ビューをアーカイブし、その後すぐにそれをアーカイブ解除します。これにより、ビューの詳細コピーが得られます。
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
UIView拡張機能を作成できます。以下の例では、Swiftスニペット)、関数copyViewはAnyObjectを返すので、UIViewのサブクラスをコピーできますieUIImageView 。onlyUIViewをコピーする場合、戻り値の型をUIViewに変更できます。
//MARK: - UIView Extensions
extension UIView
{
func copyView<T: UIView>() -> T {
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
}
}
使用例:
let sourceView = UIView()
let copiedView = sourceView.copyView()
swift3.0.1の場合:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
UIView
はNSCoping
プロトコルを実装しません。IView.hの宣言を参照してください。
@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>
そのため、copy
のようなメソッドが必要な場合は、NSCoping
プロトコルをカテゴリなどに実装する必要があります。