Как изменить стандартный дизайн FBSDKLoginButton iOS 8.3/Swift 1.2?

В настоящее время я работаю над приложением, и мне нужно изменить дизайн кнопки Facebook по умолчанию, который предоставляется Facebook SDK. Мне удалось сделать предоставленную кнопку прозрачной и прикрепить ее над разработанным представлением, и это сработало хорошо (теперь дизайн соответствует, и функциональность кнопки Facebook SDK работает хорошо). моя проблема возникла после того, как я это сделал, потому что кнопка потеряла свои эффекты пользовательского интерфейса (без выделения при нажатии). Пожалуйста, если кто-нибудь может мне помочь, мне нужно добавить эффект выделения к этой разработанной кнопке. Позвольте уточнить: я разработал UIView как кнопку, я поместил над ней прозрачную кнопку Facebook SDK, результатом является форма моего дизайна и функциональность кнопки Facebook одновременно, потери: нет эффекта выделения при нажатии.


person Alaa    schedule 16.07.2015    source источник


Ответы (2)


Я пробовал следующий код, он дает функциональность в правильном порядке. Однако мне не удалось придать эффект выделения кнопке при нажатии на нее. вот код:

{
    if (FBSDKAccessToken.currentAccessToken() != nil)
        {
            // if user logged in then handleTap func will run instead of button functionality
            let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
            self.btnSignUpwithFaceBook.addGestureRecognizer(tap)

        }

        else
        {
            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = self.btnSignUpwithFaceBook.center
            loginView.frame.size.width = self.btnSignUpwithFaceBook.frame.width
            loginView.frame.size.height = self.btnSignUpwithFaceBook.frame.height
            loginView.frame.origin.x = self.btnSignUpwithFaceBook.frame.origin.x
            loginView.frame.origin.y = self.btnSignUpwithFaceBook.frame.origin.y

            for subView in loginView.subviews
            {
                subView.removeFromSuperview()
            }
            loginView.layer.shadowColor = UIColor.clearColor().CGColor

            loginView.setBackgroundImage(nil, forState: UIControlState.Normal)
            loginView.setBackgroundImage(nil, forState: UIControlState.Application)
            loginView.setBackgroundImage(nil, forState: UIControlState.allZeros)
            loginView.setBackgroundImage(nil, forState: UIControlState.Highlighted)
            loginView.setBackgroundImage(nil, forState: UIControlState.Reserved)
            loginView.setBackgroundImage(nil, forState: UIControlState.Selected)

            loginView.setImage(nil, forState: UIControlState.Normal)
            loginView.setImage(nil, forState: UIControlState.Application)
            loginView.setImage(nil, forState: UIControlState.allZeros)
            loginView.setImage(nil, forState: UIControlState.Highlighted)
            loginView.setImage(nil, forState: UIControlState.Reserved)
            loginView.setImage(nil, forState: UIControlState.Selected)

            loginView.backgroundColor = UIColor.clearColor()
            // just for test
            self.btnSignUpwithFaceBook.layer.borderWidth = 1
            self.btnSignUpwithFaceBook.layer.borderColor = UIColor.whiteColor().CGColor
            loginView.layer.backgroundColor = UIColor.clearColor().CGColor

            loginView.readPermissions = ["public_profile", "email", "user_friends"]
            loginView.delegate = self
            loginView.setTranslatesAutoresizingMaskIntoConstraints(false)

            var constX = NSLayoutConstraint(item: loginView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.btnSignUpwithFaceBook, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
            view.addConstraint(constX)

            var constY = NSLayoutConstraint(item: loginView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.btnSignUpwithFaceBook, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
            view.addConstraint(constY)

            let views = ["loginView": loginView]

            var constH = NSLayoutConstraint.constraintsWithVisualFormat("H:[loginView(57)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)
            view.addConstraints(constH)


            var constW = NSLayoutConstraint.constraintsWithVisualFormat("V:[loginView(281)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)

            view.addConstraints(constW)

}

на самом деле основная проблема заключается в том, что facebookLogInButton является настраиваемым классом для FBSDK, и Swift не считает его uiButton, поэтому свойство выделения не появляется. Таким образом, цель, которую я стремлюсь найти с вашей помощью, заключается в том, чтобы найти способ, с помощью которого facebookLoginButton будет рассматриваться как uiButton в Swift.

person Alaa    schedule 22.07.2015

Вы можете использовать UIButton по умолчанию и использовать FBSDKManager вместо использования Facebook SDK/FBSDKLoginButton для входа в систему. Вы можете установить выделенный цвет состояния и т. д. в UIButton.

Вызовите метод fbLoginInitiate из IBAction вашей пользовательской кнопки FB.

func fbLoginInitiate() {
    let loginManager = FBSDKLoginManager()
    loginManager.logInWithReadPermissions(["public_profile", "email"], handler: {(result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
        if (error != nil) {
            // Process error
            self.removeFbData()
        } else if result.isCancelled {
            // User Cancellation
            self.removeFbData()
        } else {
            //Success
            if result.grantedPermissions.contains("email") && result.grantedPermissions.contains("public_profile") {
                //Do work
                self.fetchFacebookProfile()
            } else {
                //Handle error
            }
        }
    })
}

func removeFbData() {
    //Remove FB Data
    let fbManager = FBSDKLoginManager()
    fbManager.logOut()
    FBSDKAccessToken.setCurrentAccessToken(nil)
}

func fetchFacebookProfile()
{
    if FBSDKAccessToken.currentAccessToken() != nil {
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

            if ((error) != nil) {
                //Handle error
            } else {
                //Handle Profile Photo URL String                        
                let userId =  result["id"] as! String
                let profilePictureUrl = "https://graph.facebook.com/\(id)/picture?type=large"

                let accessToken = FBSDKAccessToken.currentAccessToken().tokenString                        
                let fbUser = ["accessToken": accessToken, "user": result]
            }
        })
    }
}
person cheeseRoot    schedule 31.08.2015