ARTS 打卡 Week 08

用户头像
teoking
关注
发布于: 2020 年 07 月 22 日
ARTS打卡Week 08

每周完成一个 ARTS:

Algorithm: 每周至少做一个 LeetCode 的算法题

Review: 阅读并点评至少一篇英文技术文章

Tips: 学习至少一个技术技巧

Share: 分享一篇有观点和思考的技术文章



Algorithm

LeetCode 98: Validate Binary Search Tree

// Runtime: O(n)
// Space: O(h) h is height of the tree.
// Runtime: 0 ms, faster than 100.00% of Java online submissions for Validate Binary Search Tree.
// Memory Usage: 38.9 MB, less than 84.91% of Java online submissions for Validate Binary Search Tree.
// 检查边界是否满足:左子树节点值小于父亲和父亲的父亲..., 右子树节点值大于父亲和父亲的父亲...
public class Solution {
public boolean isValidBST(TreeNode root) {
return isValid(root, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
}
boolean isValid(TreeNode root, double min, double max) {
if (root == null) {
return true;
}
if (root.val <= min || root.val >= max) {
return false;
}
boolean isLeftValid = isValid(root.left, min, root.val);
boolean isRightValid = isValid(root.right, root.val, max);
return isLeftValid && isRightValid;
}
}



Review

UIBezierPath Lesson: How to draw Cuphead on layers

BezierPath: Line, QuadCurve, Curve

UIBezier预定义的shape:rectangles, ovals, circles, the arc of circles, rounded rectangles



CAlayers的坐标系统:

不是直角坐标系,In the layer coordinate system, you don’t have a negative value, and all shapes will draw from the left-top corner.



画线:指定起止点

画四边形曲线:指定起点,指定结束点,控制点

画曲线:指定起点,指定起点和两个控制点

UIBezierPath实现画现状,CAShapeLayer来实现设置lineWidth, fillColor, strokeColor。

效果图:



这篇文章介绍了如何用UIBezierPath和CAShapeLayer绘制复杂图形。不过在实际项目中,更多使用贴图的方式来实现复杂图形图形。此外,在某些app场景,如编辑器界面,复杂形状可以提前配置好,然后再通过程序解析为代码,而不是手动代码实现。



Tips

iOS中,UICollectionView根据服务器下发的尺寸展示图片。效果如下:

关键点:使用UICollectionViewDelegateFlowLayout,然后实现如下方法:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
// 获取size
CGSize size = [self.viewModel getPreviewImageSize:indexPath.row];
float width = UIScreen.mainScreen.bounds.size.width - 48;
float ratio = width / size.width;
return CGSizeMake(width, ratio * size.height);
}



然后,注意将动态变高度的view,改为frame布局。如我这里是一个ImageView:

- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:REUSED_IDENTIFIER forIndexPath:indexPath];
UIImageView *imageView;
for (UIView *view in cell.subviews) {
if (view && [view isKindOfClass:[UIImageView class]]) {
imageView = (UIImageView *)view;
break;
}
}
if (!imageView) {
// 使用frame布局
imageView = [[UIImageView alloc]initWithFrame:cell.contentView.bounds];
imageView.contentMode = UIViewContentModeScaleToFill;
imageView.layer.cornerRadius = 4.0;
imageView.clipsToBounds = YES;
[cell addSubview:imageView];
}
// Do other things
return cell;
}



当然SO上这篇文章说道:

Note that in 99% of cases, to achieve full width cells + autolayout dynamic height, simply use a table view. It's that easy.



Share

最近由于经常调用后台接口,于是捡起postman辅助调试。用了几天发现现在的功能已经比几年前增加了很多。这个工具可以加入常备工具箱了。



用户头像

teoking

关注

Monkey plays software. 2018.11.28 加入

程序员。目前主要从事Android和iOS开发。

评论

发布
暂无评论
ARTS打卡Week 08