小编Tom*_*ren的帖子

Android - 编写自定义(复合)组件

我正在开发的Android应用程序的主要活动已经变得非常大.这主要是因为它包含TabWidget3个选项卡.每个选项卡都有很多组件.活动必须立即控制所有这些组件.所以我认为你可以想象这个Activity有20个字段(几乎每个组件都有一个字段).它还包含许多逻辑(单击侦听器,填充列表的逻辑等).

我通常在基于组件的框架中做的是将所有内容拆分为自定义组件.然后,每个自定义组件都有明确的责任.它将包含它自己的一组组件以及与该组件相关的所有其他逻辑.

我试图弄清楚如何做到这一点,我在Android文档中发现了他们喜欢称之为"复合控制"的东西.(请参阅http://developer.android.com/guide/topics/ui/custom-components.html#compound并滚动到"复合控件"部分)我想基于XML文件创建这样一个组件来定义查看结构.

在文档中它说:

请注意,就像使用Activity一样,您可以使用声明式(基于XML)方法来创建包含的组件,也可以从代码中以编程方式嵌套它们.

嗯,这是个好消息!基于XML的方法正是我想要的!但它没有说明如何做到这一点,除了它"像一个活动"...但我在一个活动中做的是调用setContentView(...)从XML膨胀视图.如果您是子类,那么该方法不可用LinearLayout.

所以我尝试像这样手动扩充XML:

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_layout, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,除了我正在加载的XML已LinearLayout声明为根元素的事实.这导致被夸大LinearLayout的孩子MyCompoundComponent本身已经是一个LinearLayout!! 所以现在我们之间有一个冗余的LinearLayout MyCompoundComponent和它实际需要的视图.

有人可以请给我一个更好的方法来解决这个问题,避免LinearLayout实例化冗余吗?

java android custom-component

131
推荐指数
1
解决办法
3万
查看次数

如何将NSMutableArray转换为特定类型的Swift数组?

我正在将我的iOS项目迁移到Swift.我是按班做的.当我从Swift调用Objective C方法时,许多Objective C类型被转换为它们的Swift对应物.

在我的例子中,Objective C NSMutableArray被转换为Swift的Array<AnyObject>.现在我的问题来了.在我的Swift类中,我从Objective C对象中获取了这样一个数组.既然我在Swift世界中,我想将这个数组转换为特定类型而不是AnyObject,因为我确定这个数组中存在什么样的对象.

编译器不会让我这样做!让我通过说我想要转换为包含字符串的数组来简化我的问题.这是我试过的:

var strings = myObjcObject.getStrings() as [String]
Run Code Online (Sandbox Code Playgroud)

我从编译器得到以下错误:

'String'与'AnyObject'不同

我必须同意编译器,因为String确实与AnyObject不同.但我不明白为什么这是一个问题.如果我愿意,我可以将AnyObject转发给String,对吧?

我也尝试过:

var strings = myObjcObject.getStrings() as? [String]
Run Code Online (Sandbox Code Playgroud)

这似乎是正确方向的一步,但getStrings()返回一个,NSMutableArray所以我得到以下错误:

'NSArray'不是'NSMutableArray'的子类型

有没有办法做我想在这里做的事情?

objective-c ios swift

66
推荐指数
4
解决办法
7万
查看次数

iPhone - UILabel包含同时具有多种字体的文本

我正在寻找一种方法来使用UILabel(或类似的东西)来显示这样的东西:

汤姆:有些消息.

这就像在Facebook应用程序中显示"你在想什么?"的方式.消息.有没有人有任何建议如何处理这个?

iphone objective-c uilabel

63
推荐指数
6
解决办法
7万
查看次数

键盘解除后,将inputAccessoryView保持可见状态

我想要做的是在iPad上的Safari中创建类似于"在页面上查找"搜索功能的东西.

我使用的是UIToolbar与在它的一些项目,并通过将其设定为它连接到键盘inputAccessoryViewUITextField.像魅力一样,但有一件事我无法弄清楚.在Safari中,当您搜索某些内容时,键盘会消失,但工具栏仍保留在屏幕底部.

有没有人知道如何做到这一点?我能想到的唯一解决方案是响应键盘解除事件,然后拉出UIToolBar并创建一个自定义动画,将其移动到屏幕底部.但这很黑.我正在寻找一个更优雅的解决方案.当键盘被解除时,可以让我决定如何处理输入附件视图.

user-interface uitoolbar uikeyboard ios

32
推荐指数
3
解决办法
8427
查看次数

iPhone:NSHTTPCookie未在应用重启期间保存

在我的iPhone应用程序中,我希望能够在我的应用程序重新启动时重用相同的服务器端会话.服务器上的会话由cookie标识,cookie在每个请求上发送.当我重新启动应用程序时,该cookie已经消失,我不能再使用相同的会话了.

当我用它NSHTTPCookieStorage查找从服务器获得的cookie 时,我注意到的是[cookie isSessionOnly]返回YES.我得到的印象是,这就是为什么不会在重新启动应用时保存Cookie的原因.我需要做什么才能使我的cookie不仅仅是会话?我必须从服务器发送哪些HTTP标头?

iphone cookies

30
推荐指数
3
解决办法
2万
查看次数

为什么UILabel边界上的动画仅在增大尺寸时起作用?

我注意到当我在动画块中更改UILabel的边界时,它只有在我增加大小时才有效,当我减小大小时UILabel只是改变了它的大小但没有动画.用普通的UIView替换UILabel按预期工作.

注意:将UILabel的contentMode属性更改为UIViewContentModeScaleToFill可以解决此问题,但我仍然不明白为什么在增加大小而不更改contentMode属性时它可以正常工作.

#import "FooView.h"

@interface FooView ()
@property (strong, nonatomic) UILabel   *label;
@property (assign, nonatomic) BOOL       resized;
@end

@implementation FooView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor lightGrayColor];

        self.label = [[UILabel alloc] initWithFrame:(CGRect){0, 0, frame.size}];
        self.label.backgroundColor = [UIColor greenColor];
        [self addSubview:self.label];
        _resized = false;

        UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeSize)];
        tapRecognizer.numberOfTapsRequired = 1;
        [self addGestureRecognizer:tapRecognizer];
    }
    return self;
}

- (void)changeSize {
    [UIView animateWithDuration:0.8
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         CGRect bounds = self.label.bounds;
                         if (self.resized) …
Run Code Online (Sandbox Code Playgroud)

objective-c uiviewanimation ios

21
推荐指数
1
解决办法
2418
查看次数

故事板:当我更改布局约束时,如何让Xcode自动更新帧?

我已经看过WWDC 2014视频(Interface Builder中的新功能),其中演示者使用Storyboard并在表视图控制器中更改表视图单元原型的高度(大约7m30s).我看到该单元格的所有子视图都在调整单元格上的高度句柄时调整大小.这很好,因为现在您可以非常快速地看到布局约束在不同场景中的表现.

他没有解释他是如何做到的.因为当我拖动表视图单元原型的高度句柄时,所有子视图的帧都不会更新.它们仅在我从菜单中选择时更新:编辑器>解决自动布局问题>更新帧(表视图控制器中的所有视图)

是否存在切换实时更新我在Storyboard中看到的视图帧的Xcode设置,遵守布局约束?

xcode interface-builder storyboard ios

18
推荐指数
1
解决办法
1万
查看次数

在Swift 2.0中使用equals运算符和NSObjects的错误?

好吧,在Swift 2.0中为NSObject子类编写自己的equals运算符时会发生一些奇怪的事情,如下所示:

func ==(lhs: MyObject, rhs: MyObject) -> Bool {
    return lhs.identifier == rhs.identifier
}
Run Code Online (Sandbox Code Playgroud)

对于看起来像这样的类:

class MyObject: NSObject {
    let identifier: String
    init(identifier: String) {
        self.identifier = identifier
    }
}
Run Code Online (Sandbox Code Playgroud)

这曾经在Swift 1.2及以下版本中运行得很好.它仍然有点工作:

let myObject1 = MyObject(identifier: "A")
let myObject2 = MyObject(identifier: "A")
let result = (myObject1 == myObject2)
// result is true
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好,但是如果两个变量都是可选项呢?

let myObject1: MyObject? = MyObject(identifier: "A")
let myObject2: MyObject? = MyObject(identifier: "A")
let result = (myObject1 == myObject2)
// result is false, equals operator was never …
Run Code Online (Sandbox Code Playgroud)

equality nsobject swift2

11
推荐指数
2
解决办法
1033
查看次数

使用storyboard时重用UIViewController实例

我决定在我目前的iPhone应用程序中使用故事板.我面临一些问题.我真的需要重用我的UIViewController实例.

那是什么意思?好吧,例如我有一个表视图控制器.当我点击一个单元格时,另一个视图控制器从故事板加载并推送到导航控制器堆栈.这一切都运行良好,但每次加载此视图控制器大约需要半秒到一秒.在我使用故事板之前,我只是通过缓存创建的实例解决了这个问题,因此第二次点击一个单元格时,可以立即显示视图控制器.

通过缓存创建的实例我的意思是这样的:

if (!cachedInstance) {
    cachedInstance = [MyViewController new];
}
[self.navigationController pushViewController:cachedInstance];
Run Code Online (Sandbox Code Playgroud)

有谁知道如何使用故事板实现这一目标?提前致谢.

objective-c uiviewcontroller ios

9
推荐指数
1
解决办法
8602
查看次数

将SCNGeometry渲染为线框

我在iOS上使用SceneKit,我想要渲染为线框的几何体.所以基本上我只想绘制线条,所以没有纹理.

我发现我可以使用shaderModifiersused 的属性SCNMaterial来实现这一点.着色器修改器的示例:

material.shaderModifiers = [
    SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;"
]
Run Code Online (Sandbox Code Playgroud)

这个例子显然只是反转输出颜色.我对用于着色器片段的'GLSL'语言一无所知.

任何人都可以告诉我,我应该使用哪些代码作为着色器片段,仅在边缘附近绘制,以使几何看起来像线框?

或者可能还有一种将几何体渲染为线框的方法.我很乐意听到它.

shader fragment-shader ios scenekit

9
推荐指数
3
解决办法
4781
查看次数