Skip to content

Instantly share code, notes, and snippets.

View wendyliga's full-sized avatar
👨‍💻
Code in Progress

Wendy Liga wendyliga

👨‍💻
Code in Progress
View GitHub Profile
@wendyliga
wendyliga / TCA_README_ID.MD
Last active September 25, 2023 04:09
swift-composable-architecture readme indonesia translation

The Composable Architecture

Composable Architecture (pendeknya TCA) adalah library untuk membangun aplikasi dengan cara yang konsisten dan mudah dimengerti, dengan komposisi, testing, dan design ergonomis. TCA dapat digunakan di SwiftUI, UIKit, dan lainnya, dan di platform Apple apa pun (iOS, macOS, tvOS, dan watchOS)

@propertyWrapper
struct NonEmptyString {
var wrappedValue: String?
init(wrappedValue: String?) {
if wrappedValue?.isEmpty == true {
self.wrappedValue = nil
} else {
self.wrappedValue = wrappedValue
}
@wendyliga
wendyliga / selected-rounded-corner-ASImageNode.swift
Created November 4, 2019 10:21
Implement layer masking with bazier path
image.imageModificationBlock = { image in
// try to set rounded corner only to top left and bottom left
var modifiedImage: UIImage?
var rect = CGRect(origin: CGPoint.zero, size: image.size)
UIGraphicsBeginImageContextWithOptions(image.size, false, UIScreen.main.scale)
let maskPath = UIBezierPath(roundedRect: rect, byRoundingCorners: [UIRectCorner.topLeft, UIRectCorner.bottomLeft], cornerRadii: CGSize(width: 10, height: 10))
maskPath.addClip()
image.draw(in: rect)
modifiedImage = UIGraphicsGetImageFromCurrentImageContext()
@wendyliga
wendyliga / Test.h
Last active October 25, 2019 14:30
/**
myProtocol.h
*/
@protocol MyProtocol <NSObject>
@property (nonatomic) BOOL myVariable;
@end
/**
MyClass.h
*/
@wendyliga
wendyliga / ViewController.swift
Created September 25, 2019 09:11
TextureGram Main View Controller
import AsyncDisplayKit
class ViewController: ASViewController<ASDisplayNode> {
private let storyNode: StoryNode
private let postNode: PostNode
init() {
self.storyNode = StoryNode(stories: Story.generateDummyStory())
self.postNode = PostNode(posts: Post.generateDummyPosts())
@wendyliga
wendyliga / StoryNode.swift
Created September 25, 2019 09:08
TextureGram StoryNode
import AsyncDisplayKit
class StoryNode: ASCollectionNode{
let stories: [Story]
init(stories: [Story]) {
self.stories = stories
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
@wendyliga
wendyliga / StoryCell.swift
Created September 25, 2019 09:04
TextureGram StoryCell
import AsyncDisplayKit
class StoryCell: ASCellNode {
private let story: Story
// MARK: - Nodes
private let userPicture: ASImageNode
private let userName: ASTextNode
init(story: Story) {
@wendyliga
wendyliga / PostNode.swift
Created September 25, 2019 08:56
TextureGram PostNode
import AsyncDisplayKit
class PostNode: ASTableNode {
private let posts: [Post]
init(posts: [Post]) {
self.posts = posts
super.init(style: .plain)
@wendyliga
wendyliga / PostCell.swift
Created September 25, 2019 08:14
TextureGram PostCell
import AsyncDisplayKit
class PostCell: ASCellNode {
let post: Post
// MARK: - Nodes
let headerNode: HeaderNode
let postImage: ASImageNode
let actionNode: ActionNode
@wendyliga
wendyliga / ActionNode.swift
Created September 25, 2019 07:51
TextureGram Action Node
import AsyncDisplayKit
class ActionNode: ASDisplayNode {
// MARK: - Nodes
private let loveButton: ASImageNode
private let commentButton: ASImageNode
private let shareButton: ASImageNode