自定义@IBDesignable UIButton使Xcode崩溃

问题描述

我想为Swift中的iOS项目设计一个带有阴影的圆形按钮。所以我想出了以下自定义按钮类:

import UIKit

@IBDesignable class MainButton: UIButton {
    private var shadowLayer: CAShapeLayer!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        let image = createBackgroundImage()
        setBackgroundImage(image,for: UIControl.State.normal)
        clipsToBounds = true
        
        contentEdgeInsets = UIEdgeInsets(top: 5,left: 20,bottom: 5,right: 20)
        
        layer.masksToBounds = false
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0,height: 3)
        layer.shadowOpacity = 0.2
        layer.shadowRadius = 6
    }
    
    func createBackgroundImage() -> UIImage {
        let rect = CGRect(x: 0,y: 0,width: frame.width,height: frame.height)
        UIGraphicsBeginImageContextWithOptions(frame.size,false,0)
        let color = UIColor.white
        color.setFill()
        UIBezierPath(roundedRect: rect,cornerRadius: frame.height * 0.5).addClip()
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetimageFromCurrentimageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

在我的情节提要中为按钮设置此类后,“ IBDEsignablesAgent-iOS”进程将占用我将近100%的cpu,Xcode会自动将其挂起。此行为使得几乎不可能正确调试问题。

我可以肯定我以错误的顺序或错误方法做某事。但是我不知道如何解决。希望这里有人可以为我指明正确的方向。

谢谢, 詹斯

解决方法

我的自定义按钮带有一些阴影和圆角,我可以在情节提要中直接使用它,而无需以编程方式进行触摸。

class RoundedCornerButtonWithShadow: UIButton {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.layer.masksToBounds = false
        self.layer.cornerRadius = self.frame.height/2
        self.layer.shadowColor = UIColor.black.cgColor
        self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds,cornerRadius: self.layer.cornerRadius).cgPath
        self.layer.shadowOffset = CGSize(width: 0.0,height: 3.0)
        self.layer.shadowOpacity = 0.5
        self.layer.shadowRadius = 1.0
    }
}
,

只需检查视图的大小是否实际更改:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

def foo(arr,sub,fig,_str,vmin,vmax,ticks,fontsize,check,tick_check):
    cm=plt.cm.jet
    P2A=0.12; box_size=5
    image=sub.matshow(arr,origin='low',cmap=cm,vmin=vmin,vmax=vmax,extent=[-10.92,10.92,-10.92,10.92],interpolation='bilinear')
    sub.axis([-box_size,box_size,-box_size,box_size])
    divider = make_axes_locatable(sub)
    sub.set_title(_str,fontsize=fontsize); sub.set_xlabel(r"A",fontsize=fontsize); sub.set_ylabel(r"B",fontsize=fontsize)
    if tick_check: cbar=fig.colorbar(image,cax=divider.append_axes("right",size="5%",pad=0.05),format='%.1E')
    else: cbar=fig.colorbar(image,format='%.1f')
    cbar.set_ticks(ticks); sub.xaxis.tick_bottom(); sub.tick_params(labelsize=10);sub.set_title(_str,y=1.01); plt.tight_layout(h_pad=1)

d_arr=np.random.rand(182,182)
fig0,(a1) = plt.subplots(ncols=1,figsize=(5,5))
im=foo(d_arr,a1,fig0,r'Test',np.min(d_arr),np.max(d_arr),np.arange(np.min(d_arr),0.1),10,False,True)
plt.savefig('Foo.eps',bbox_inches='tight',dpi=100)

创建阴影的速度很慢,x每秒被调用数十次(基本上每帧一次)。