Ad

Change Lazy Button Opacity From Outside Of The Class

- 1 answer

I need to change alpha value of the button in another class. But the problem is button created as "lazy var" so I can not change that value.

lazy var middleButton: UIButton = {
    let button = UIButton(type: .custom)
    button.frame.size = CGSize(width: 56, height: 56)
    button.layer.cornerRadius = button.frame.width / 2
    button.layer.masksToBounds = true
    button.backgroundColor = .white
    button.setImage(UIImage(named: "iconBasket"), for: .normal)
    button.contentMode = .center
    button.imageView?.contentMode = .scaleAspectFit
    button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    button.addTarget(self, action: #selector(btnBasketClicked))
    addSubview(button)
    return button
}()

I want this button's alpha as 0.2 when view is scrolling. Here is the code

extension ProductListView: UIScrollViewDelegate{
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0{
        // alpha = 0.2
        MyTabBar.shared.scrollDown()

    }
    else{
         // alpha = 1.0
         MyTabBar.shared.scrollUp()
        }
    }

}

    func scrollDown(){
    middleButton.alpha = 0.2
}

I've tried lots of way but doesn't work. Calling "addSubView()" function in "layoutSubviews()" solve my problem but this causes another problem which my function "basketButtonClicked()" are not called. I used Delegate pattern and here it is.

protocol BasketButtonDelegate: class {
func basketButtonClicked()

}

@objc private func btnBasketClicked(_ sender: UIButton!){
    
    delegate?.basketButtonClicked()
}

override func layoutSubviews() {
    super.layoutSubviews()
    addSubview(middleButton)
}

When I call "addSubView" function in "layoutSubviews()", "basketbuttonClicked" never called.

extension TabCoordinator : BasketButtonDelegate
{
    func basketButtonClicked(){
        log.debug("basketButtonClicked")
        let coor = CartCoordinator(navigationController, hidesBar: true)
        childCoordinators.append(coor)
        coor.start()
    }
}

(I assigned delegate so the problem is not about it.)

A bit complicated but I hope we can figure it out.

Ad

Answer

You need to add protocol to your MyTabBar class . It should be like this

class MyTabBar {
    static var shared = MyTabBar()
    weak var delegate : abc?
    func scrollDown(){
        delegate?.xyz()
    }
 }

 protocol abc : AnyObject {
     func xyz()
 }

And in your class

class btnView : UIView , abc{
lazy var middleButton: UIButton = {
    let button = UIButton(type: .custom)
    button.frame.size = CGSize(width: 56, height: 56)
    button.layer.cornerRadius = button.frame.width / 2
    button.layer.masksToBounds = true
    button.backgroundColor = .red
    button.contentMode = .center
    button.imageView?.contentMode = .scaleAspectFit
    button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    button.addTarget(self, action: #selector(btnBasketClicked), for: .touchUpInside)
    return button
}()

required init?(coder: NSCoder) {
    super.init(coder: coder)

}
override init(frame: CGRect) {
    super.init(frame: frame)
}
@objc func btnBasketClicked(){
    print("Im here")
}

func addMiddleButton(){
    self.addSubview(middleButton)
}

func alphaaa(){
    self.middleButton.alpha = 0.2
}

func xyz() {
    self.alphaaa()
}

}

Last , in your ProductListView create and instance of your view , or if you add with autolayout just call 2. function in your viewDidLoad

    var viewwww = btnView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
    viewwww.addMiddleButton() // call to add btn to custom view

and extension

func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0{
    // alpha = 0.2
    MyTabBar.shared.delegate = viewwww
    MyTabBar.shared.scrollDown()

}
else{
     // alpha = 1.0
     MyTabBar.shared.scrollUp()
    }
}
Ad
source: stackoverflow.com
Ad