Forum Archive

Change Color of selected segmentcontrol

Killerburns

Hey guys,
I’am quite new to pythonista and i already love it. Everything is well documented and there is a thread for everything you need in this Forum. Except for this special requirement. For my own App í´m trying to figure out how i can set the color of the selected segment.

During my search i found this topic https://forum.omz-software.com/topic/5672/custom-font-for-ui-segmentedcontrol and i was able to get this to work in my code. But unfortunately its only the font type, color and size. But if we can access theese attributes wouldnt we be able to change the color of the selection as well.?

I tried with the attribute nsforegroundcolorattributename, but without succes. And i have to admit, I have no experience with object C.

So has anyone a clue how i can get this to work? I would really appreciate it :)

Best wishes

cvp

@Killerburns read this topic

Killerburns

Hi cvp,
Thanks for your reply. I have already seen this thread, and as i mentioned was able to change color of the font as you describe it in the the thread you have posted. If its about the „get back ios 12 appearance“ i really have no idea how to use that :( I‘am really a beginner.

I thought about to build a own segmented control with buttons and ui animate if this is too complicated to get it work with the build in segmented control.

cvp

@Killerburns Try this, almost nothing in Objective C 😅

import ui
from objc_util import *

v = ui.View()
v.frame = (0,0,400,200)
v.background_color = 'white'

d = 64
items = ['aaa','bbb']
sc = ui.SegmentedControl()
sc.frame = (10,10,d*len(items),d)

sc.segments = items
def sc_action(sender):
    idx = sender.selected_index
    o = ObjCInstance(sender).segmentedControl()
    #print(dir(o))
    idx = o.selectedSegmentIndex()
    for i in range(len(items)):
        if i == idx:
            with ui.ImageContext(d,d) as ctx:
                path = ui.Path.rounded_rect(0,0,d,d,5)
                ui.set_color('red')
                path.fill()
                s = 12
                ui.draw_string(items[idx], rect=(0,(d-s)/2,d,s), font=('Menlo', s), color='black', alignment=ui.ALIGN_CENTER)
                ui_image = ctx.get_image().with_rendering_mode(ui.RENDERING_MODE_ORIGINAL)
            o.setImage_forSegment_(ui_image.objc_instance,idx)
        else:
            o.setTitle_forSegmentAtIndex_(items[i],i)
sc.action = sc_action
v.add_subview(sc)

v.present('sheet')

Killerburns

Thanks @cvp for spending your time to help me out here. Youre brilliant :). There is only one thing that disturbs a bit. You still can see the indicator moving behind the red path and its still white which doesnt look nice on a dark theme. Maybe there is a solution to animate this rectangular shape to the position of the selected index, so that the indicator is always covered?

I think for now i will build my own segmented control with buttons, labels and a colored custom view with a background color that animates x to the button that has been pressed. Thats a dirty solution but this way i know what i‘am doing :D

But if you or someone else wants find a perfect and effectiv solution for this, feel free to do so and share it with us :)

Thanks again for your support
Best wishes and
Stay safe

///

Almost the same now :P but dirty solution

https://imgur.com/Qs8p9ta

```
import ui

def segment_tapped(sender):
x = sender.x

if sender.name == "FireTv":
    v['segmentedCtrl_input']['idx'].width = 56
    x = x+2

elif sender.name == "Musik":
    v['segmentedCtrl_input']['idx'].width = 57  
    x = x-1

else:   
    v['segmentedCtrl_input']['idx'].width = 59

animate_movex(v['segmentedCtrl_input']['idx'],x)

for a in buttons:
    if a.name == sender.name:
        a.font = ('Avenir-Heavy', 13)
    else:
        a.font = ('Avenir-Book', 13)

def animate_movex(v, x):
def a():
v.x = x
ui.animate(a, 0.3)

v = ui.load_view()
buttons = v['segmentedCtrl_input'].subviews

v['segmentedCtrl_input']['idx'].background_color = '#92b8ff'

for a in buttons:
a.font = ('Avenir-Book', 13)

v.present('sheet') ```

Gagnon_265

Hello guys,
Sorry @killerburns but the code provided by @cvp is correct and is working absolutely fine for me. Please go through your code once again and find if you have any errors in there.
Thanks @cvp for sharing your valuable work with us.
Please keep us posted if you get any errors or solution for this.

MyAARPMedicare

myagkayaanna

Want to buy academic papers for a low cost? Grab a speedypaper discount code and get the best price for your essays easily.

marknany

Sarinasuon A Rattle Toy and all the latest and hottest toys for the upcoming season. Long sleeve cotton newborn pajamas Shop A Rattle Toy & More. Get A Rattle Toy at Target Today.This is a universal hammer scientifically engineered to please the fussiest builder baby!
They are perfectly suitable for grabbing, Baby Carrier Cloak Mantle Cover, jingling, Long sleeves cartoon overalls, chewing, natural cotton sling and slobbering. Bold colour, texture and contrasting fabrics Sarinasuon have been used for visual and tactile stimulation.