У меня есть дочерний контроллер, который имеет сложные представления пользовательского интерфейса. Мой вид разработан в раскадровке. Это заставляет экран замораживаться, и это увеличивает вероятность сбоя, если пользователь продолжает нажимать на замораживаемом экране.Загрузка пользовательского интерфейса в другой ветке в Swift
Возможно ли, что я загружаю пользовательский интерфейс в другой теме и показываю пользователю индикатор активности?
Я знаю, что совпадение находится в флажках посередине. флажки - это пользовательские uibuttons. Я рисую их на drawRect. в зависимости от выбора, ширины границы, динамического цвета границы, динамического выделенного цвета границы, фона, цвета фона выбора.
Edit: отмечают, что SuperView тег не 500. Это вид множественного. Реализация
func setupCheckBox(checkbox: CheckBox) {
checkbox.setCornerRadius(radius: CGSize(width: checkbox.frame.size.width * 0.5, height: checkbox.frame.size.height * 0.5))
checkbox.setBorderWidth(width: 2.0)
checkbox.setBorderColor(border_color: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0))
checkbox.setSelection(selection_color: UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 0.9))
checkbox.setSelected(selection: false)
checkbox.setHit(edgeInsets: UIEdgeInsets(top: -4, left: -4, bottom: -4, right: -4))
checkbox.delegate = self
}
CheckBox:
protocol CheckBoxProtocol: class {
func checkbox(checkBox: UIView, selection: Bool)
}
class CheckBox: RoundedCornersButton {
var checked_icon: String?
var unchecked_icon: String?
weak var delegate: CheckBoxProtocol?
var selectedd: Bool = false
var allow_none: Bool = false
var hitEdgeInsets: UIEdgeInsets?
var selection_color: UIColor?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setHit(edgeInsets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0))
selection_color = .clear
backgroundColor = .clear
addTarget(self, action: #selector(didTouchButton), for: .touchUpInside)
}
func setCheckedIcon(checked_icon: String) {
self.checked_icon = checked_icon
setSelectionTo(button: self, selected: selectedd, inform: nil)
}
func setUncheckedIcon(unchecked_icon: String) {
self.unchecked_icon = unchecked_icon
setSelectionTo(button: self, selected: selectedd, inform: nil)
}
func setSelection(selection_color: UIColor) {
self.selection_color = selection_color
setNeedsDisplay()
layoutIfNeeded()
}
// if superview tag is equal to 500. all other checkbox in the superview will deselected.
func didTouchButton() {
if superview?.tag == 500 {
for button: UIView in (superview?.subviews)! {
if button is CheckBox && button != self {
setSelectionTo(button: button as! CheckBox, selected: false, inform:delegate)
}
}
setSelectionTo(button: self as CheckBox, selected: allow_none ? (!selectedd) : true, inform:delegate)
} else {
setSelectionTo(button: self as CheckBox, selected: !selectedd, inform:delegate)
}
}
func setSelectionTo(button: CheckBox, selected: Bool, inform: CheckBoxProtocol?) {
button.selectedd = selected
if selected {
if checked_icon != nil {
(button as CheckBox).setImage(UIImage.init(named: checked_icon!), for: .normal)
}
if color != .clear {
button.setTitleColor(color, for: .normal)
}
} else {
if unchecked_icon != nil {
(button as CheckBox).setImage(UIImage.init(named: unchecked_icon!), for: .normal)
}
if selection_color != .clear {
button.setTitleColor(selection_color, for: .normal)
}
}
button.setNeedsDisplay()
button.layoutIfNeeded()
inform?.checkbox(checkBox: button, selection: selected)
}
func setSelected(selection: Bool) {
super.isSelected = selection
setSelectionTo(button: self, selected: selection, inform: nil)
setNeedsDisplay()
layoutIfNeeded()
}
func setHit(edgeInsets: UIEdgeInsets)
{
hitEdgeInsets = edgeInsets
}
// handeling hits on checkbox. taking in count the hitEdgeInsets. if hitEdgeInsets have minus values hits around the checkbox will be considered as a valid hits.
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
if UIEdgeInsetsEqualToEdgeInsets(hitEdgeInsets!, .zero) || !isEnabled || isHidden {
return super.point(inside: point, with: event)
}
let relativeFrame: CGRect = self.bounds
let hitFrame: CGRect = UIEdgeInsetsInsetRect(relativeFrame, hitEdgeInsets!)
return hitFrame.contains(point)
}
func isSelectedd() -> Bool {
return selectedd
}
func setAllowNone(_ allow: Bool) {
allow_none = allow
}
override func draw(_ rect: CGRect) {
super.draw(rect)
let context: CGContext = UIGraphicsGetCurrentContext()!
context.setFillColor((selection_color?.cgColor)!)
context.setStrokeColor((selection_color?.cgColor)!)
let circlePath: UIBezierPath = UIBezierPath.init(arcCenter: CGPoint(x: frame.size.width * 0.5, y: frame.size.width * 0.5), radius: frame.size.width * 0.5 - borderWidth, startAngle: 0, endAngle: CGFloat(2.0 * Float(M_PI)), clockwise: true)
if isSelectedd() {
circlePath.fill()
circlePath.stroke()
}
}
}
Закругленные углы Реализация:
class RoundedCornersButton: UIButton {
var cornorRadius: CGSize!
var borderWidth: CGFloat!
var borderColor: UIColor!
var color: UIColor!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
cornorRadius = CGSize(width: 12, height: 12)
borderWidth = 0
borderColor = UIColor.clear
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = true
self.titleLabel?.lineBreakMode = .byClipping
self.titleLabel?.baselineAdjustment = .alignCenters
self.titleLabel?.textAlignment = .center
// clear the background color to draw it on the graphics layer
color = self.backgroundColor
self.backgroundColor = UIColor.clear
}
func setColor(_color: UIColor) {
color = _color
self.setNeedsDisplay()
self.layoutIfNeeded()
}
func setCornerRadius(radius: CGSize) {
cornorRadius = radius
self.setNeedsDisplay()
self.layoutIfNeeded()
}
func setBorderWidth(width: CGFloat) {
borderWidth = width
self.setNeedsDisplay()
self.layoutIfNeeded()
}
func setBorderColor(border_color: UIColor) {
borderColor = border_color
self.setNeedsDisplay()
self.layoutIfNeeded()
}
// redraw without increasing or decreasing hiting area.
override func draw(_ rect: CGRect) {
// Drawing code
super.draw(rect)
// drawing context
let context: CGContext = UIGraphicsGetCurrentContext()!
// set fill color
context.setFillColor(color.cgColor)
// theme color
let themeColor: UIColor = borderColor
// set stroke color
context.setStrokeColor(themeColor.cgColor.components!)
// corners to round
let corners: UIRectCorner = UIRectCorner.allCorners
// bezier path rect
let bezierRect: CGRect = CGRect(x: rect.origin.x+borderWidth*0.5, y: rect.origin.y+borderWidth*0.5, width: rect.size.width-borderWidth, height: rect.size.height-borderWidth)
// rounded path
let roundedPath: UIBezierPath = UIBezierPath.init(roundedRect: bezierRect, byRoundingCorners: corners, cornerRadii: cornorRadius)
// set stroke width
roundedPath.lineWidth = borderWidth
// fill coloring
roundedPath.fill()
// stroke coloring
roundedPath.stroke()
}
}
См. Http://stackoverflow.com/questions/27212254/using-threads-to-update-ui-with-swift –
Сначала введите информацию. Во-вторых, я знаю об этом. мы не должны обновлять ui из фонового потока. Моя проблема другая. сам ui является сложным. – hasan83
У меня есть я ... Одна вещь, которую я знаю, это то, что приложение не имеет исключения и не имеет объемного объема данных, поэтому оно никогда не будет разбиваться при нажатии на другой экран приложения. –