Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
ImageView UI Designer Code
-
Okay, Does anyone know any code to load a image in the ui designer (ImageView) cause I want to use my own custom image I know how to import custom images but not sure how to load them in the ui designer. If Anyone can help that would be awesome!
-
@SYS that works (see custom attributes at bottom, tested ok with my own images)
import ui v = ui.load_view() v.present('sheet')
-
Hi
Is there a way to visualise the custom image inside the ui designer?ie so you can use as a background to help place other ui elements?
The stock icons display fine, could that be extended somehow to alllow for another location of custom images to be dragged dropped onto canvas and visualised as a bg?
I not anyone have any other ideas apart from painstakingly building up many elements in code and testing line by line.
I have a lot of rectangular regions I want to define ideally interactively on top of an image as ref.
Thought about writing something to do just this task but it’s potentially lots of work when designer has everything apart from that 1 feature…is ui designer hackable? -
@rb only to show I'm in the right way...
Not yet the correct image but already a customized image in ImageView in the designer.
To be perfect, the script should extract the image file from custom attributes, I'll try but perhaps not today, sorrySet this script as a Pythonista tool and select it when your .pyui is edited in the designer
from objc_util import * import ui @on_main_thread def SetImageInDesigner(): win = ObjCClass('UIApplication').sharedApplication().keyWindow() main_view = win.rootViewController().view() def analyze(v,indent): for sv in v.subviews(): #print(indent,sv._get_objc_classname()) if 'UIImageView' in str(sv._get_objc_classname()): if 'OMUIWidgetViewImageView' in str(sv.superview()._get_objc_classname()): if 'OMUIDesignCanvasView' in str(sv.superview().superview()._get_objc_classname()): sv.setImage_(ObjCInstance(ui.Image.named('test:Lenna'))) analyze(sv,indent+' ') analyze(main_view,'') return if __name__ == '__main__': SetImageInDesigner()
-
@rb new version, needs
{'image': ui.Image.named('xxxxxxxxxx')}
in custom attributes of ImageViewPlease, test it and give me some feedback, thanks
import editor import ast import json from objc_util import * import ui @on_main_thread def SetImageInDesigner(): global filenames filenames = {} t = "ui.Image.named('" fil = editor.get_path() with open(fil) as f: dic = json.load(f)[0] nodes = dic['nodes'] for node in nodes: if node['class'] == 'ImageView': attrs = node['attributes']['custom_attributes'] i = attrs.find(t) if i >= 0: j = attrs.find("')", i) img = attrs[i+len(t):j] nam = node['attributes']['name'] filenames[nam] = img win = ObjCClass('UIApplication').sharedApplication().keyWindow() main_view = win.rootViewController().view() def analyze(v,indent): global filenames for sv in v.subviews(): #print(indent,sv._get_objc_classname()) if 'UIImageView' in str(sv._get_objc_classname()): if 'OMUIWidgetViewImageView' in str(sv.superview()._get_objc_classname()): if 'OMUIDesignCanvasView' in str(sv.superview().superview()._get_objc_classname()): w = sv.superview() for svw in w.subviews(): if 'UILabel' in str(svw._get_objc_classname()): n = str(svw.text()) break if n in filenames: sv.setImage_(ObjCInstance(ui.Image.named(filenames[n]))) analyze(sv,indent+' ') analyze(main_view,'') return if __name__ == '__main__': SetImageInDesigner()
-
Hey cvp both work perfectly thankyou so much !the latter obvs more elegant as I can important multiple images :) this has saved me a lot of time and energy again...
If I was to ask for even more..one thing that would be a great option would be to lock the position of bg images like this from being moved in the view somehow? Unless there is already a native way to do this in designer.
Its really easy to accidentally select and move a large image if your trying to populate / use it for ref to create other items on top of.
Maybe it’s only selectable in ui and not moveable by default in ui with touch ?That way it can be set in properties (usually 0,0,w,h for me) to fill the bg.Thanks again!
-
@rb I guess that I don't understand your request. I think that the image in an ImageView is not movable. Perhaps am I wrong.
-
@rb As the topic title speaks about ImageView, perhaps I did not understand correctly.
Perhaps do you want to set a background image to the entire view?Édit: and do you want that an ImageView as subview of the view becomes unmovable
-
Sorry yes - I’m loading an imageView as a sub view of the .pyui main ui.view and I’m basically using it as a bg image to help me position some other elements that I incorporate into another project later ie the easiest way to accurately place elements on an image is using the designer.I’m just saying that if the imageView that I use as a bg that fills entire canvas ,isn’t locked somehow in the designer ui ,it is very easy to accidentally select it and move it.
-
@rb try to only insert one line
w = sv.superview() w.setFrame_(w.superview().frame()) # <-------------------------- for svw in w.subviews():
If you were busy to focus an ImageView, it's blue border would stay at its previous position/size but tap anywhere and it will disappear. Perhaps I'm not clear, try to
- change an ImageView position/size and let this object focused
- run the tool
- you will see the object back to 0,0,w,h but the blue focus border would stay because the code does not change it
- tap anywhere and it will disappear
-
@cvp not sure I understand..
I just want to lock a selected imageView in the ui at its current position I think so that it will no longer move unless using the properties window.
-
Also I can longer get either method to work today on a pyui that was working fine yesterday..or any other pyui - any ideas why that would happen?
I put a print statement in to check if it was finding the image name and it seems to be- it’s just not showing the image any longer.
-
@rb said
I just want to lock a selected imageView in the ui at its current position I think so that it will no longer move unless using the properties window.
I can't force as not movable but if you tap the script as tool, it resets the ImageView frame as full view if you had changed erroneously its position or size
-
@rb said
I put a print statement in to check if it was finding the image name and it seems to be- it’s just not showing the image any longer.
I got the same problem and have remarked a blank into the "named", like "test: Lena" instead of "test:Lenna" and I don't know why
-
@cvp so no longer working for you either?
Weird!? -
@rb no, no, it works but yesterday I got the same problem, check the file name in your custom attributes
-
@rb with a blank in file name, no image is showed. Don't ask me why
-
@cvp no blanks no typos the test:Lenna works but not other images.Cant see a reason for it to not work. If I access an image in a dir the syntax would be :
{'image': ui.Image.named('testDir/test.jpg')}
Right?
At least that’s what I was doing yesterday and it worked…I’m confused. -
@rb Perhaps due in which dir you were, could you try with the full path?
-
@rb this works (I present to you my dog, Nana)