首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏木宛城主

    Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 1)

    那么如何去设计SubView和SubViewModel,我总结出几条原则: 当一个功能被不同的场合频繁用到,建议将这个功能抽象成SubView(SubViewModel) SubView(SubViewModel )应该保持高内聚,低耦合原则 SubViewModel不应该处理具体的业务逻辑,它很单纯,可通过委托Delegate的方式交由外部处理 构建SubView和SubViewModel 假设现在有如下一个需求 看到左上角的勋章吗,这个勋章会在不同的场景出现,我们优先把它考虑成一个SubView(BadgeView),也就是最外层的FaceBoxView里嵌套了一个BadgeView。 badgeView.BindingContext.Initialization(newValue); } 我们可以看到,组件化的实施从代码量上是变得复杂了,组件的颗粒度越细,那么嵌套的层次就越深,如果某个功能只出现一次,并且不会被复用,那么我不推荐将它变为一个SubView uMVVM的理念是只需要一个View,View是唯一的入口,并且View可以是非常复杂,里面维护了所有的SubView,所以换UI也好,换功能也罢,只要关注于对应的View即可。

    1.3K50发布于 2018-01-11
  • 来自专栏木宛城主

    Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 2)

    SubView行为多变性 在上篇文章中,我阐述了为什么要使用SubView,总结起来就3个字:『可复用』 。 那么问题来了,既然是可复用,那就意味着SubView可以在任何场景下使用,那怎样才能确保它做的是正确的行为呢? 举个栗子,还是 以如下图FaceBox为例,不同的场景下点击头像应该处理不同的事: ? 在战团中点击头像,则显示该成员的具体信息 在队伍里点击头像,则进入换人界面 在战斗时点击头像,则显示它配置的战术 你看,同样一个SubView,在不同的场景下它的行为往往是不一致的。 定制SubView的行为 你可能会以如下方式去定制SubView的行为: void OnClick(){ if(战团){ 显示该成员的具体信息 }else if(队伍){ 一个Button也好,还是一个SubView也好,他们都是可复用的组件,不应该与具体的业务逻辑相结合。通过事件或者委托的形式,暴露给开发者来决定究竟要处理什么逻辑,这样才能和具体业务逻辑解耦。

    83770发布于 2018-01-11
  • 来自专栏韦弦的偶尔分享

    Swift编程小技巧

    6、数组内元素的类型转换 常见的情况在获取一个视图的所有子视图后,需要给某一类视图做一些操作,以UILabel为例 使用for in 循环 for subview in self.view.subviews { if subview is UILabel { (subview as! UILabel).text = "find" } } for subview in self.view.subviews where subview is UILabel { (subview UILabel).text = "find" } for subview in self.view.subviews.compactMap({$0 as? UILabel}) { subview.text = "find" } for case let subview as UILabel in self.view.subviews {

    1.3K11发布于 2020-03-20
  • 来自专栏肘子的Swift记事本

    SwiftUI 4.0 的全新导航系统

    ,均将创建其实例( 不对 body 求值 ) NavigationLink("SubView2", destination: SubView2(), tag: Target.subView1 ", value: Target.subView1) // 只声明关联的状态值 NavigationLink("SubView2", value: Target.subView2 : SubView1() case .subView2: SubView2 : SubView1() case .subView2: SubView2() .task{ // 使用 append 可以跳入指定层级,下面将为 root -> SubView3 -> SubView1 -> SubView2 ,在初始状态添加层级将屏蔽动画

    12.4K62编辑于 2022-07-28
  • 来自专栏freesan44

    WKWebView加载PDF屏蔽长按功能弹框

    问题 近期有个需求,需要在WKWebView加载PDF中,基于安全的理由,屏蔽【复制、选择全部】等功能弹窗 解决方案 捕捉长按手势后进行屏蔽,问题是,原来手势是放在view的subview中,导致一直屏蔽 dispatch_get_main_queue(), ^{ for (UIView *view in webView.subviews) { for (UIView * subview in view.subviews) { for (UIGestureRecognizer *gesture in subview.gestureRecognizers) isEqualToString:@"UILongPressGestureRecognizer"] ) { [subview removeGestureRecognizer:gesture]; } } // if ([NSStringFromClass([subview

    77350编辑于 2023-02-14
  • 来自专栏全栈程序员必看

    ios9中 UIStackView的使用[通俗易懂]

    ios9中 UIStackView的使用 by 伍雪颖 UIStackView能够 垂直或水平排布多个subview, 自己主动为每一个subview创建和加入Auto Layout constraints. 1.加入subview let logoImage: UIImageView = UIImageView (image: UIImage (named UIView .animateWithDuration( 0.25 , animations: { self .stackView.layoutIfNeeded() }) 2.删除subview

    96510编辑于 2022-07-10
  • 来自专栏码客

    iOS 使用WKWebView

    { //页面加载完成时 for subview in webView.scrollView.subviews { if(subview.gestureRecognizers ! = nil){ for longPress in subview.gestureRecognizers! { if(longPress is UILongPressGestureRecognizer){ subview.removeGestureRecognizer(longPress { //页面加载完成时 for subview in webView.scrollView.subviews { if(subview.gestureRecognizers ! = nil){ for longPress in subview.gestureRecognizers!

    2K10发布于 2019-10-21
  • 来自专栏MapleYe

    【iOS】修改根控制器后,view的叠加在窗口的问题

    in self.rootViewController.view.subviews) { [subView removeFromSuperview]; } // in self.subviews) { if (subView.subviews.count == 0) { [subView removeFromSuperview ]; } } } 由于项目是用swift编写的,然后兴冲冲的将以上代码翻译成swift语言,发现怎样都不能满足 subView.subviews.count == 0 。 经过打印子view的层级结构,发现UILayoutContainerView仍残余 UITransitionView,那么这个就是 subView.subviews.count == 0 不满足的原因。 因此,我们只要耐心等专场动画结束后,再去判断 subView.subviews.count == 0即可。

    1.5K10发布于 2020-03-28
  • 来自专栏Helloted

    View编程指南(三)

    这里仅仅是少数: 布局和subview管理 view定义了与其父view相关的默认调整大小行为。 一个view可以管理subview列表。 view可以根据需要重写subview的大小和位置。 使用这些方法比删除subview并重新插入它们要快。 要从其superview移除subview,请调用subview的removeFromSuperview方法(而不是superview)。 当subview添加到其父项时,subview的当前frame矩形表示它在superview内的初始位置。frame位于其superview的可见边界之外的subview在默认情况下不会被剪切。 请记住,如果您从其supview中删除subview并打算重用它,则必须再次保留该subview。 removeFromSuperview方法在移除之前autorelease一个subview。 将subview添加到另一个View时,UIKit会通知superview和subview

    3K30编辑于 2022-06-07
  • 来自专栏freesan44

    WKWebView加载PDF屏蔽长按功能弹框

    问题近期有个需求,需要在WKWebView加载PDF中,基于安全的理由,屏蔽【复制、选择全部】等功能弹窗解决方案捕捉长按手势后进行屏蔽,问题是,原来手势是放在view的subview中,导致一直屏蔽view dispatch_get_main_queue(), ^{ for (UIView *view in webView.subviews) { for (UIView * subview in view.subviews) { for (UIGestureRecognizer *gesture in subview.gestureRecognizers) isEqualToString:@"UILongPressGestureRecognizer"] ) { [subview removeGestureRecognizer:gesture]; } }// if ([NSStringFromClass([subview

    79340编辑于 2023-01-18
  • 来自专栏云原生布道专栏

    【IOS开发基础系列】UIScrollView专题

    tracking messages 消息到subview。  sMyViewTotal;             subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y   = subView.showNumber - sMyViewTotal;             subView.frame = CGRectMake(subView.frame.origin.x,  subView.frame.origin.y - (sMyViewTotal/2) * (sMyViewHeight + sMyViewGap), subView.frame.size.width, subView.frame.size.height tracking messages 消息到subview

    3.1K30编辑于 2023-10-16
  • 来自专栏技术总结

    学会不一样的Loading图

    mask layer // 添加圆角 UIBezierPath *defaultCoverblePath = [UIBezierPath bezierPathWithRoundedRect:subview.bounds cornerRadius:subview.frame.size.height/2.0/*subview.layer.cornerRadius*/]; if ([subview isMemberOfClass :[UILabel class]] || [subview isMemberOfClass:[UITextView class]]) { defaultCoverblePath = [UIBezierPath ; // 计算subview相对super的view的frame CGPoint offsetPoint = [subview convertRect:subview.bounds toView :view].origin; [subview layoutIfNeeded]; [relativePath applyTransform:CGAffineTransformMakeTranslation

    1.2K40发布于 2018-12-19
  • 来自专栏岑志军的专栏

    iOS获取当前网络环境

    statusBar"] valueForKey:@"foregroundView"]subviews]; NSNumber *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView ") class]]) { dataNetworkItemView = subview; break; } } switch

    1.1K50发布于 2018-05-28
  • 来自专栏freesan44

    iOS 圆角和阴影并存的方法

    这句话的意思就是,圆角都是我给你割出来的,圆角外面的阴影自然也割掉了~ 所以,这么看来,圆角与阴影不能并存啊(仅限这种圆角实现的方式) 处理方式 在下面再加一个subView负责处理圆角,而父类view // 设置阴影半径 parentView.layer.shadowRadius = 3* standard; parentView.layer.masksToBounds = NO; subView : NSInteger standard = 1; subView.layer.cornerRadius = 10*standard; subView.layer.masksToBounds = YES; 注意父类View的masksToBounds=NO cornerRadius等于subView的大小 suvBiew的masksToBounds=YES 添加一个上层Layer: CALayer

    4.1K20发布于 2019-04-29
  • 来自专栏Swift社区

    SwiftUI 新容器视图 API 深度解析:轻松构建自定义布局

    ScrollView(.horizontal) { LazyHStack { ForEach(subviews: content) { subview in subview .containerRelativeFrame(.horizontal) LazyHStack { ForEach(subviews[1...], id: \.id) { subview in subview .containerRelativeFrame in subview .containerRelativeFrame

    1.3K33编辑于 2024-09-30
  • 来自专栏月亮与二进制

    iOS遍历打印所有子视图引实现结

    view subviews]; // 如果没有子视图就直接返回 if ([subviews count] == 0) return; for (UIView *subview stringWithFormat:@" %@", blank]; } // 打印子视图类名 NSLog(@"%@%d: %@", blank, level, subview.class ); // 递归获取此视图的子视图 [self getSub:subview andLevel:(level+1)]; } } 这里我只打印了子view的类型,其实还可以知道它们的frame等信息,只需要在打印时将 subview.class 改成直接打印 subview 就可以了,就能得到这个 subview 的所有信息。

    87020发布于 2021-11-23
  • 来自专栏好派笔记

    iOS获取网络的最新方法

    statusBar"] valueForKey:@"foregroundView"] subviews]; NSNumber *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView" ) class]]) { dataNetworkItemView = subview; break; } } int netType =

    55400发布于 2021-10-31
  • 来自专栏阿林前端开发攻城狮

    iOS获取网络的最新方法

    statusBar"] valueForKey:@"foregroundView"] subviews]; NSNumber *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView" ) class]]) { dataNetworkItemView = subview; break; } } int netType =

    43000发布于 2021-09-23
  • 来自专栏陈满iOS

    iOS-JavaScript交互方案:网页监听APP返回键(goback)+APP监听网页返回键(JS调用OC对象方法)

    Thanks to @boliva - http://stackoverflow.com/posts/comments/34452906 for(UIView *subview in [ navigationBar subviews]) { if(0. < subview.alpha && subview.alpha < 1.) { [UIView animateWithDuration:.25 animations:^{ subview.alpha = 1.;

    4.7K30发布于 2018-09-10
  • 来自专栏css小迷妹

    ios 获取网络类型

    statusBar"] valueForKey:@"foregroundView"] subviews]; NSNumber *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView" ) class]]) { dataNetworkItemView = subview; break; } } int netType =

    1.4K10发布于 2021-10-29
领券