You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.1 KiB

6 years ago
  1. // Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
  2. //
  3. // You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
  4. // copy, modify, and distribute this software in source code or binary form for use
  5. // in connection with the web services and APIs provided by Facebook.
  6. //
  7. // As with any software that integrates with the Facebook platform, your use of
  8. // this software is subject to the Facebook Developer Principles and Policies
  9. // [http://developers.facebook.com/policy/]. This copyright notice shall be
  10. // included in all copies or substantial portions of the software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  14. // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  15. // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  16. // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  17. // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  18. import Foundation
  19. import FBSDKShareKit
  20. /**
  21. A button for sharing content.
  22. */
  23. public class ShareButton<C: ContentProtocol>: UIView {
  24. fileprivate var sdkShareButton: FBSDKShareButton
  25. /// The content to share.
  26. public var content: C? = nil {
  27. didSet {
  28. sdkShareButton.shareContent = content.flatMap(ContentBridger.bridgeToObjC)
  29. }
  30. }
  31. /**
  32. Create a new ShareButton with a given frame and content.
  33. - parameter frame: The frame to initialize with.
  34. - parameter content: The content to share.
  35. */
  36. public init(frame: CGRect? = nil, content: C? = nil) {
  37. let sdkShareButton = FBSDKShareButton()
  38. let frame = frame ?? sdkShareButton.bounds
  39. self.sdkShareButton = sdkShareButton
  40. self.content = content
  41. super.init(frame: frame)
  42. addSubview(sdkShareButton)
  43. }
  44. required public init?(coder aDecoder: NSCoder) {
  45. fatalError("init(coder:) has not been implemented")
  46. }
  47. /**
  48. Performs logic for laying out subviews.
  49. */
  50. public override func layoutSubviews() {
  51. super.layoutSubviews()
  52. sdkShareButton.frame = CGRect(origin: .zero, size: bounds.size)
  53. }
  54. /**
  55. Resizes and moves the receiver view so it just encloses its subviews.
  56. */
  57. public override func sizeToFit() {
  58. bounds.size = sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
  59. }
  60. /**
  61. Asks the view to calculate and return the size that best fits the specified size.
  62. - parameter size: A new size that fits the receivers subviews.
  63. - returns: A new size that fits the receivers subviews.
  64. */
  65. public override func sizeThatFits(_ size: CGSize) -> CGSize {
  66. return sdkShareButton.sizeThatFits(size)
  67. }
  68. /**
  69. Returns the natural size for the receiving view, considering only properties of the view itself.
  70. - returns: A size indicating the natural size for the receiving view based on its intrinsic properties.
  71. */
  72. public override var intrinsicContentSize: CGSize {
  73. return sdkShareButton.intrinsicContentSize
  74. }
  75. }