xmartlabs / xlactioncontroller Goto Github PK
View Code? Open in Web Editor NEWFully customizable and extensible action sheet controller written in Swift
License: MIT License
Fully customizable and extensible action sheet controller written in Swift
License: MIT License
I have created a controller that extend from ActionController and everything works fine, but im trying to use the scrollViewDidScroll but i can't detect the event when the user scroll.
i have implemented the delegate
collectionView.delegate = self
but the scrollViewDidScroll method never is called.
how can i use this method?? i need to change the scrollView indicator design.
Are there anyways to add a subview to the actionsheet?
Xcode 7.3, iOS9, newest XLActionController.
Is there any way to alter the speed of dismissal of SkypeActionController? Changing the dismiss speed/velocity/damping in settings did not seem to do anything.
how can i add image to periscopeExample as a youtube...??
Hi,
Is it a possibility to reload the number of actions when the action sheet is show ? For example, I wait for a web service call to hide a row.
Thx
XLActionController 3.0.0, XCode 8, iOS9
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<XLActionController.ActionCell 0x7ff32660de50> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key actionTitleLabelConstraintToContainer.'
It appears that actionTitleLabelConstraintToContainer and actionTitleLabelConstraintToImageView don't have outlets in ActionCell.swift.
How do you present a UIAlertController during a click handler of an action?
Currently if you try to present an action (for Example 'Are you sure you want to delete'), then this error will occur:
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UIAlertController: 0x13c953a80>)
Hi,
Is there a simple way to make the header close the sheet when taped?
Thanks
With the iPhone X, the home indicator is appearing over the last cell.
The best way would be to add the bottom constraints to the bottom safe area.
I have a situation where depending upon some condition I need to change either text or background color of an individual Action.
For eg. I have a list of books in which a book can be added to reading list and on tap of that I display action sheet where there are 4 actions. If that book is already added to reading list I have to show the reading list action in green color and if not added then default color.
Can this be possible? and if so then can you show me how to do it?
Thanks
is there any difference in selecting any of the style
public enum ActionStyle {
case Default
case Cancel
case Destructive
}
because i don't think above struct used anywhere
Environment: XLActionController v3.0.1, Xcode 8.1 and iOS 10.
I'm trying to make a custom header view but in testing, noticed it was not being added to the action sheet. After setting breakpoints, it seems as though my onConfigureHeader
block in my actionController was not being called. Looking in ActionController.swift
revealed that the method collectionView:viewForSupplementaryElementOfKind
was not being called at all as part of the delegate. What would cause this? The following is what my actionController looks like:
`class ndJActionController: ActionController<ndJReusableActionCell, ActionData, ndJHeaderView, ndJActionHeaderData, UICollectionReusableView, Void> {
// override init in order to customize behavior and animations
public override init(nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
collectionViewLayout.minimumLineSpacing = -0.5
settings.behavior.hideOnScrollDown = false
settings.animation.scale = nil
settings.animation.present.duration = 0.6
settings.animation.dismiss.duration = 0.6
settings.animation.dismiss.offset = 30
settings.animation.dismiss.options = .curveLinear
cellSpec = .nibFile(nibName: "ndJActionCell", bundle: Bundle(for: ndJReusableActionCell.self), height: { _ in 46 })
onConfigureCellForAction = { cell, action, indexPath in
cell.setup(action.data?.title, detail: nil, image: action.data?.image)
cell.alpha = action.enabled ? 1.0 : 0.5
UIView.animate(withDuration: 0.30) {
}
}
onConfigureHeader = { (header: ndJHeaderView, data: ndJActionHeaderData) in
header.imageView.image = data.image
header.textField.placeholder = data.textFieldPlaceHolder
}
}
required init?(coder aDecoder: NSCoder) {
// Just call super. Probably could leave the fatalError code that was here since I don't think it'll ever be called, but oh whale ๐ณ.
super.init(coder: aDecoder)
}
}`
I recently updated my pods to migrate to Swift 4 and saw that XLActionController has recently received an update that introduces Swift 4 support.
Everything works as expected but when I use it in a project that has a share extension I get a compile error that notes UIApplication.shared is not available.
This is likely caused by a commit for #66 where support for RTL designs was added with the function isRTL() in DynamicCollectionViewFlowLayout.swift. (4664dee)
I know that other frameworks often detect if UIApplication.shared is available and use other APIs if it is not.
When I set the "Only App-Extension-Safe API" build setting to "NO" for the XLActionController pod target the compile error is gone, but this is only a temporary solution because it resets with every pod update.
Is there a support for iPad presentation?, currently I would like to present the options on iPhone via modal animation, however on iPad I would like to show the controller as popover. Is there a way to include this behaviour to controller?
Before submitting issues ...
When submitting issues, please provide the following information to help maintainers to fix the problem faster:
Xcode 8, iOS 10, latest XLActionController
It looks like the top inset in the Spotify Example are set too high (here's a screenshot after the tableView has been pulled down).
A simple fix right now looks like increasing the offset by the height of the header.
contentHeight = layoutAtts!.frame.origin.y + layoutAtts!.frame.size.height + 2 * (headerSpec?.height(headerData!))!
when calculating contentHeight.
I'd make a PR, however I've made lots of other changes to the examples, so it wouldn't be too useful: https://github.com/codeOfRobin/xlactionviewcontroller
Hello!
When I install XLActionController in my podfile and restart Xcode I get 110 errors. I thought it would be compatible with swift 3?
I tried it multiple times.
Do I have to specify branch?
Example app crashes in this method in DynamicCollectionViewFlowLayout:
override open func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let animator = dynamicAnimator else {
return super.layoutAttributesForElements(in: rect)
}
return animator.items(in: rect) as? [UICollectionViewLayoutAttributes]
}
Here's the console log:
fatal error: NSArray element failed to match the Swift Array Element type
2017-10-23 16:27:45.074075-0400 Example[18698:29187926] fatal error: NSArray element failed to match the Swift Array Element type
(lldb)
Using XCode 9 with Swift 4. Choose Tweetbot from the tableview sample app options.
Hey guys,
Is there any way to apply a maximum height an action controller can have over the main view?
Thanks.
Getting an error while attempting to display XLActionController, problem seems to arise below
// in DynamicCollectionViewFlowLayout
override public func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath?) -> UICollectionViewLayoutAttributes? {
guard let indexPath = indexPath else {
return nil
}
guard let animator = dynamicAnimator else {
--> Error thrown: return super.layoutAttributesForItemAtIndexPath(indexPath)
}
return animator.layoutAttributesForCellAtIndexPath(indexPath) ?? setupAttributesForIndexPath(indexPath)
}
override public func prepareForCollectionViewUpdates(updateItems: [UICollectionViewUpdateItem]) {
super.prepareForCollectionViewUpdates(updateItems)
updateItems.filter { $0.updateAction == .Insert && layoutAttributesForItemAtIndexPath($0.indexPathAfterUpdate) == nil } .forEach {
setupAttributesForIndexPath($0.indexPathAfterUpdate)
}
}
// in ActionController.swift
// calculate content Inset
collectionView.layoutSubviews()
if let section = _sections.last where !settings.behavior.useDynamics {
let lastSectionIndex = _sections.count - 1
--> Error thrown: let layoutAtts = collectionViewLayout.layoutAttributesForItemAtIndexPath(NSIndexPath(forItem: section.actions.count - 1, inSection: hasHeader() ? lastSectionIndex + 1 : lastSectionIndex))
contentHeight = layoutAtts!.frame.origin.y + layoutAtts!.frame.size.height
}
The layoutAtts causes a crash, not sure why. Editing contentHeight to hard coded values seems to resolve it...
Is there an alternate way to set the contentHeight and display position in place of depending on the layout attributes?
Include tests to check that adding actions to the action controller is properly working. Right, it's natively supported adding actions before showing the action controller.
There is a workaround that allow the user to add more actions to the action controller after it was shown, take a look to this issue for reference on how to do it: #44. So this test suite may cover it.
Can the controller be presented on the top part of the screen instead of the bottom?
Thanks
I am getting a build error
Undefined symbols for architecture armv7:
"direct field offset for XLActionController.ActionController.(collectionViewLayout.storage in _A6CDD4E8E9CAF75D03A0E33C7BEC0AB2) : XLActionController.DynamicCollectionViewFlowLayout?", referenced from:
XLActionController.ActionController.collectionViewLayout.setter : XLActionController.DynamicCollectionViewFlowLayout in MenuViewControllerAnimatedTransitioning.o
XLActionController 3.0.1, XCode 8.2.1, Swift 3, Cocoapods 1.2.1
Other posts around this issue make it sound like an issue of subclassing a class that uses public lazy vars.
I am subclassing ActionController
in order to update settings
and onConfigureCellForAction
Not really an issue, more like a suggestion for improvement.
I have been struggling with trying to figure out how to use multiple UIColectionViewCells classes on a single action sheet.
For example, if I wanted a specific view at index N, with a height different from the other cells. Maybe a Decoration View would be more appopriate?
Hi @m-revetria
Just a reminder: The #24 has been merged with master and effectively updated this lib to Swift 3, but podspec and a tag is required to make it available through cocoapods.
Thanks again,
M.
is it possible to add? a dismiss handler to addAction function??
what i want to do is that i want to do someting after dismiss actionController...
An error occurred using iOS 11 devices, Please update your library.
The problem caused on this line.
return animator.items(in: rect) as? [UICollectionViewLayoutAttributes]
And the error log is
Fatal error: NSArray element failed to match the Swift Array Element type
Looks like a problem with casting animator.items
It's weird, I can see the 'xlactioncontroller' tag coming from your link in github to stack overflow, but when I try to post a new question, it says that this 'xlactioncontroller' tag is a new tag.
And I would need some help:) Any idea on what's happening on stack overflow? Thanks!!
Hey, thanks for the great library. I'm using the out of the box Skype action controller, but it seems I can't change the background color without copying the source to my own project. Would be awesome, if it could be made changeable either from constructor or a class variable.
Hi,
Just one little bug on iOS 10, the "status bar hidden" config doesn't work.
settings.statusBar.showStatusBar = false
Thx
Your component is great!
I just regret that we can't customize the cancel button.
In the example of spotify, if you want to put a button with title in black (white by default, you can not modify it) and add margins to the left and right), how can you do it?
Thank you in advance
Hi there,
Just got the pod and trying to play around with it. I keep getting "Use of unresolved identifier '...'", no matter which controller I try to instantiate, for example:
let actionsheet = YoutubeActionController()
I've imported the lib and all should be fine, however it's not. What to do?
When I click on one of the skypeController cells where I have added a segue, it will perform the segue to another view controller but come back again in like 1 sec
Hello, thank you for the great library! Is a Swift 4 release coming within the next few weeks? I see there is a swift4
branch but would love to point directly to the latest release for Swift 4 support now that Swift 4 is officially released.
Recently I have updated XLActionController
from 4.0.0 to 4.0.1 and found out that now there is a large gap between CANCEL
button and first action item above it. It is observable on both the iPhone 8 and iPhone X (the gap is smaller on iPhone X) . I'm almost sure that it's the recently added support for iPhone X to blame - use of the safe area offset somehow messed up collection view content size/inset.
If CANCEL
button is disabled - action sheet renders just fine.
P.S. I was forced to revert back to 4.0.0 and use my own two-lines fix to support iPhone X...
Environment: XLActionController 4.0.1, Xcode 9.3, Swift 4.1, iOS 11.0 (simulator), iOS 11.3 (iPhone X).
Thanks.
I'm getting a crash on rotation at line 49 in ActionCell.swift.
actionTitleLabelConstraintToImageView?.priority = UILayoutPriorityDefaultHigh
the error I'm getting is:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Mutating a priority from required to not on an installed constraint (or vice-versa) is not supported. You passed priority 1000 and the existing priority was 1000.'
*** First throw call stack:
Heyo, I'm having trouble trying to get a proper header view working. I've implemented a header view, with code shown below. I've also included a screenshot:
The header has a UITextField
and UIImageView
in it & I want the header to be the same color as the regular actions, like the cancel. But, it keeps getting darkened as I think the actionController doesn't know that the header is there and treating it as part of the background. What can I do about this? I'm following the Spotify example for making header but it isn't working out with the YouTube type cells.
My custom header view:
class ndJHeaderView: UICollectionReusableView {
open lazy var imageView: UIImageView = {
let imageView = UIImageView(frame: CGRect.zero)
imageView.image = UIImage(named: "plusIcon")
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFit
imageView.sizeToFit()
return imageView
}()
open lazy var textField: UITextField = {
let textField = UITextField(frame: CGRect.zero)
textField.textColor = UIColor(white: 0.098, alpha: 1.0)
textField.translatesAutoresizingMaskIntoConstraints = false
textField.sizeToFit()
return textField
}()
public override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
open override func awakeFromNib() {
super.awakeFromNib()
initialize()
}
func initialize() {
self.translatesAutoresizingMaskIntoConstraints = false
self.backgroundColor = UIColor.black.withAlphaComponent(0.0)
self.addSubview(imageView)
self.addSubview(textField)
let views: [String : Any] = ["ico": imageView, "title": textField]
let metrics = [ "icow": 40, "icoh": 40 ]
let options = NSLayoutFormatOptions()
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[ico(icow)]-10@750-[title]-25-|", options: [.alignAllCenterY], metrics: metrics, views: views))
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(>=25)-[title]", options: [.alignAllCenterY], metrics: metrics, views: views))
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[ico(icoh)]", options: options, metrics: metrics, views: views))
}
}
iOS 11 is inserting scroll view insets related to the safe area, which put more whitespace in the collection view than is necessary, pushing content off-screen and adding unnecessary scrolling.
I was able to correct this by adding the following to my subclass of ActionController:
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
}
The code likely needs to be updated to account for the safe area changes, as well as the bottom area on iPhone X.
Currently, I'm trying to combine the examples Spotify and Tweetbot to create my own custom ActionController like this:
I believe my current code should take care of this, but I'm not able to get the header view up and instead my code results in this:
My current code looks like this:
Does anyone know how I can get this to work the way I want?
If I double click on one of Skype XLActionController options, The function that should be executed, executed twice.
How can I block the user for clicking twice?
Using xcode 7.3 and iOS 9.3.
Thanks
Just updated to Xcode 8 and have tons of compiler errors with the library. Support for Swift 3.0 would be great!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.