Skip to content

Instantly share code, notes, and snippets.

View ilyapuchka's full-sized avatar

Ilya Puchka ilyapuchka

View GitHub Profile
@ilyapuchka
ilyapuchka / StickyLayout.swift
Last active February 25, 2024 18:43
Really sticky collection view layout
// The issue with sectionHeadersPinToVisibleBounds and sectionFootersPinToVisibleBounds is that they do not pin
// first header and last footer when bouncing. This layout subclass fixes that.
class StickyLayout: UICollectionViewFlowLayout {
override init() {
super.init()
self.sectionFootersPinToVisibleBounds = true
self.sectionHeadersPinToVisibleBounds = true
}
import Foundation
public struct Unit: Codable, Equatable {
init() {}
public init(from decoder: Decoder) {}
public func encode(to encoder: Encoder) throws {}
public static func ==(lhs: Self, rhs: Self) -> Bool {
return true
}
}
@ilyapuchka
ilyapuchka / StyleProxy.swift
Last active May 19, 2020 20:14
Adaptive Font styles
public protocol Stylish: class {
func updateStyle()
}
public class StyleProxy<S: Stylish>: NSObject {
fileprivate override init() { }
}
private class StyleProxyView<S: Stylish>: UIView {
@ilyapuchka
ilyapuchka / Enums.swift
Created November 6, 2017 20:58
Codable tips suggestions
/*
Instead of using enum it's possible to use RawRepresentable struct that will give you support for "unsupported" values,
but will cost you excastive switches (you'll alwyas have to handle default case, which will stand for those "unsupported" values)
It's defenetely more code than if using optional, but might be better if it comes to unwrapping this value everywhere.
*/
//enum System: String, Decodable {
// case ios, macos, tvos, watchos
//}
struct System: RawRepresentable, Decodable {
@ilyapuchka
ilyapuchka / UIVisualEffect.swift
Last active January 21, 2020 21:57
(Ab)using UIVisualEffectView effect settings
extension UIVisualEffectView {
private var filterLayer: CALayer? {
return layer.sublayers?.first
}
private var blurFilter: NSObject? {
return filterLayer?
.filters?.flatMap({ $0 as? NSObject })
.first(where: { $0.value(forKey: "name") as? String == "gaussianBlur" })
@ilyapuchka
ilyapuchka / Stringify.swift
Created June 16, 2019 13:02
FunctionBuilders
func stringify(@StringBuilder _ value: () -> Stringified) {
print(value().value)
}
struct Stringified {
let value: String
init(_ value: String) {
self.value = "stringified " + value
}
}
@ilyapuchka
ilyapuchka / lint.sh
Last active July 15, 2019 15:49
Run swiftlint only on files changed from the latest commit
!/bin/sh
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
FILES=($(git ls-files -m | grep ".*\.swift$" | grep -v ".*R.generated.swift$"))
if [[ ${FILES[@]} ]]; then
export "SCRIPT_INPUT_FILE_COUNT"="${#FILES[@]}"
for i in "${!FILES[@]}"; do
export "SCRIPT_INPUT_FILE_$i"="${FILES[$i]}"
done
class A {
let factory: ()->()
var closure: ((b: B)->())?
init(factory: ()->()) {
self.factory = factory
}
deinit {
@ilyapuchka
ilyapuchka / create_xcode_snippets.rb
Last active September 9, 2018 15:10
Generate Xcode snippets from XCTest_Gherkin step definitions
#!/usr/bin/env ruby
# Usage:
# chmod 755 create_xcode_snippets.rb
# ./create_xcode_snippets.rb --project_path "path-to-project-file.xcodeproj"
require 'xcodeproj'
$project_path = File.expand_path(ARGV.find.with_index { |item, index| ARGV[index - 1] == "--project_path" })
$snippets_path = File.expand_path("~/Library/Developer/Xcode/UserData/CodeSnippets/")
$snippet_prefix = "STEP-"
@ilyapuchka
ilyapuchka / EmbededTableView
Created December 28, 2015 16:14
UITableView subclass that wraps it's content
class EmbededTableView: UITableView {
override func intrinsicContentSize() -> CGSize {
layoutIfNeeded()
return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height)
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()